[자바기초] 3. 연산자

연산자

// 두 연산은 같은 연산 (개발자가 일일히 쓰는게 귀찮으니 고슬링 아저씨가 이렇게 허용해줌)


```java
    short num = 10;
    num = (short)(num + 77L); // 강제 형변환 ; 실무에서 좋은코드 아님 why? 강제로 형변환을 쓰면 오차 생길확률도 높고 정밀도가 떨어짐
    int rate = 3;
    rate = (int)(rate * 3.5); // double로 바뀌면서 강제형변환 해줘야함 ; int로 형변환해줬으니 뒤에 소수점 잘린다
    System.out.println(num);
    System.out.println(rate);
===================================================
    int num = 10;
    num += 77L;
    int rate = 3;
    rate *= 3.5;
    System.out.println(num);
    System.out.println(rate);

→ 복합대입연산자는 형변환이 필요하지 않다(***)

## 2. 관계연산자

==========================================

▶ 0인가? false

(관계연산자 연산할때 주의할점!!)
```java
    int num1 = 0;
    int num2 = 0;
    boolean result;
		
    result = ((num1 += 10) <0 ) && ((num2 += 10) > 0);
	    System.out.println("result = " + result);
	    System.out.println("num1 = " + num1);
	    System.out.println("num2 = " + num2 +'\n');
		
    result = ((num1 += 10) > 0) || ((num2 += 10) > 0);
	    System.out.println("result = " + result);
	    System.out.println("num1 = " + num1);
	    System.out.println("num2 = " + num2);
===================================================

▶  result = false
	num1 = 10
	num2 = 0

	result = true
	num1 = 20
	num2 = 0

★ 이런 현상이 발생하는 이유?
&& ; 앞뒤 둘다 true 나와야 참인데 앞에 먼저 false 나오면 결과적으로 false 될수밖에 없음
따라서 앞이 false로 결론이 나면 뒤에는 계산을 아예 하지도 않음
|| ; 앞뒤 둘 중 하나만 맞음 true 따라서 앞에 먼저 true 나오면 뒤에 계산안함 –> 내가 이걸 자꾸 간과함

## 3. 부호연산자

    short num1 = 7;
    short num2 = (short)(+num1); /* 형변환을 해줘야하는이유: 우리 눈에는 안보이지만 얘도 연산을 하고 있음 정확히는 1*num1 
                                                           따라서 int형으로 바뀌니 형변환을 해줘야한다*/
    short num3 = (short)(-num2);// (-1) * num2

4. 증감연산자

: num = num + 1 → ‘++n / n++’ 같은 말 ; 1을 증가시키고 변수에 값을 대입한다
num = num - 1 → ‘–n / n–’ 같은 말 ; 1을 감소시키고 변수에 값을 대입한다

    int num  = 7;
    int result;
		
    result = (++num) -5; // num값 8 → 8-5를 result에 대입 (1이 바로 증가)
    System.out.println(result); // 3 출력
		
    result = (num++) -5; // num값 7 → 7-5를 처리하고 +1  result에 '3' 대입 (연산이 먼저 일어나고 증가) 
    System.out.println(result);  // 3 출력
//증감연산자 중 후위연산자01
    int num = 5;
    System.out.print((num++) + " ");
    System.out.print((num++) + " ");
    System.out.print(num + "\n");
		
    System.out.print((num--) + " ");
    System.out.print((num--) + " ");
    System.out.print(num);
========================================
  5 6 7
    7 6 5
//증감연산자 중 후위연산자02
    int num = 5;
    num--;
    System.out.println(num);
=========================================
 4

★주의)
케바케로 상황마다 다르지만 여기 소스코드에선 하나의 실행코드의 단위가 끝나고 난 뒤 ‘ ; ‘ + 1이 증가

// 실행코드의 단위가 위와 다른경우 

    int x = 10;
    int y = x-- + 5 + --x;/* 연산자 우선순위가 다르다! 
                          (x--)&(--x)먼저 연산됨 {(10--)+ 5} + (9) 10과 5를 더하고 난 후 실행단위가 한번끝남 따라서 더하고 나서 -1 */
    System.out.println(y); 
==========================================
 23

5. 비트연산자

: 비트단위로 연산하는 연산자

    byte n1 = 5; //00000101
    byte n2 = 3; //00000011
    byte n3 = -1;//11111111 
		
    byte r1 = (byte)(n1 & n2); // 00000001
    byte r2 = (byte)(n1 | n2); // 00000111
    byte r3 = (byte)(n1 ^ n2); // 00000110
    byte r4 = (byte)(~n3); // 00000000
		
    System.out.println(r1); // 00000001 '1'
    System.out.println(r2); // 00000111 '7'
    System.out.println(r3); // 00000110 '6'
    System.out.println(r4); // 00000000 '0'

** 1 비트는 00000000 -1 비트는 11111111

6. 쉬프트연산자 («, »)

: 데이터를 비트 단위로 이동시켜 값을 증감시키는 연산자
쉬프트 연산자는 한칸이동하면 빈 공간은 ‘0’으로 채우고 제일 앞 비트는 버린다
이동하면서 밀리더라도 java는 -일경우 최상의 부호비트는 보존한다

문제01)

// 양수이면 true 음수이면 false
    int num = 1000;
    boolean result;
		
    result = num > 0;
    System.out.println(num + "은 음수입니까? " + result);
=============================================================
 1000  음수입니까? false