Java/Java의 정석

Chapter 03 연산자(Operator)

계란💕 2022. 2. 19. 00:44

1. 연산자 

  1.4 연산자의 우선순위와 결합 규칙

  1) 순서: 산술 -> 비교 -> 논리 -> 대입

  2) 단항(1) > 이항(2) > 삼항(3). (단항 연산자의 우선순위가 이항 연산자보다 높다.)

  3) 단항 연산자(++ -- + - ~ ! type)와 대입 연산자를 제외한 모든 연산의 진핸 방향은 왼쪽에서 오른쪽이다. 

    -> 대입 연산자(=, +=, -=, *=,  /-,  %=,... )

 

  Note) 관계 연산자 (결과로 true/ false 반환)

  - >. >=, <, <=, !=, ==

 

 

2. 단항 연산자

  2.1 증감연산자: ++, --

 

 

3. 산술 연산자

  Ex 3-7)

<hide/>
public class OperatorEx7 {
	public static void main(String[] args) {
		byte a = 10;
		byte b = 30;
		byte c = (byte) (a * b);
		System.out.println(c);
	}
}

  Note) 실행 결과: 44

  - 300은 byte형의 범위(-128~127)를 넘기 때문에 데이터 손실이 발생한다. 

  - 이러한 값 손실을 예방하기 위해 충분히 큰 자료형을 사용해야 한다.

 

 

4. 비교 연산자

  4.2 등가비교 연산자 == !=

  - 대소빅교 연산자와 다르게 기본형/ 참조형/ 모든 자료형에 사용할 수 있다. 

  - 문자열 비교: equals() -> 대소문자 구별 , equalsIgnoreCase() -> 대소구분 없음

 

 

5. 논리 연산자

  5.1 논리 연산자 ( || (OR 결합), && (AND 결합), ! )

  - true, false를 결과로 얻는다. 

  5.2 비트 연산자 ( &(AND 연산자), |(OR 연산자), ^(XOR 연산자), ~, <<, >>)

  - 비트 연산자는 피연산자를 비트 단위로 논리연산한다. 

  - ^(XOR, 배타적 eXclusive OR): 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0.

  - ~(비트 전환 연산자, '1의 보수'연산자) 

     -> 피연산자를 2진수로 표현했을 때 0->1, 1->0으로 바꾼다.

    -> 비트 전환 되고 나면 부호 있는 타입의 피연산자는 부호가 반대로 변경된다. 

  - toBinaryString() : 비트 연산의 결과를 2진수로 출력하는 메서드

 

  Def) 쉬프트 연산자 <<, >> (bit shift operators)

  - <<(signed left shift), >>(signed right shift)

  - 이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 왼쪽/오른쪽으로 이동한다. 

  - 8 << 2(8의 2진수를 왼쪽으로 두 칸 이동) 의 결과는 32가 된다. 

  - x << n은 x * 2^n의 결과와 같다.

  - x >> n은 x / (2^n)

  - 쉬프트 연산자는 /, *보다 우선순위가 빠르다.

 

  <left shift>

  - <<: 가장 오른쪽 비트를 모두 0으로 채운다.

  -  "<<<"는 음수이건 양수이건  결과가 동일하므로 굳이 <<< 연산자가 존재하지 않는다. 

 

  <right shift>

  - >>: 가장 왼쪽 비트인 부호 비트는 원래의 비트로 채운다.

          음수의 경우, 이동된 빈 자리에 0이 아닌 1로 채운다.

  - >>>(Unsigned right shift): 가장 왼쪽 비트인 부호 비트는 모두 0으로 채운다.

           음수의 경우에도 이동된 빈자리에 0을 그대로 채운다. 

 

    - 축약하는 것도 가능하다.

      ex) i1 <<= 3; 기존의 i1을 왼쪽으로 세 칸 이동하여 대입한다.

 

 

  Ex 3-31) 

<hide/>
public class OperatorEx31 {
	public static void main(String[] args) {
		int dec = 1234;
		int hex = 0xABCD;
		int mask = 0xF;		
		System.out.printf("hex = %X%n", hex);
		System.out.printf("%X%n", hex & mask);		
		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);		
		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);		
		hex = hex >> 4;
		System.out.printf("%X%n", hex & mask);	
	}
}

  Note) 실핼 결과

  - 쉬프트 연산자와 비트 AND 연산자를 이용해서 16진수를 끝에서부터 한자리씩 뽑는 예제이다.

  - 비트 AND 연산자는 두 bit가  모두 1일 때만 1이 된다.

  - 그러므로 0xABCD와 0x000F를 비트AND연산하면 마지막 자리만 남고 앞에 나머지 세 자리는 모두 0이 된다. 

    -> 1010 1011 1100 1101 & 0000 0000 0000 1111 => 0000 0000 0000 1101 = D

  - 0xABCD >> 4 => 0x0ABC 

  

 

6. 그 외의 연산자

  6.1 조건 연산자(삼항연산자) ? : 

  - result = ( 조건식 ) ? 식1 : 식2 .. (괄호가 필수는 아니다. )

  - 조건식평가 결과애 따라 true이면 식1, false이면 식2가 연산 결과가 된다. 

 

  6.2 복합대입연산자 

  - '다른 연산자' + '='

  -  <<= , >>= , &= , ^=, |=

 

 

7. 보수(complement)

  - 1의 보수: 어떤 수를 2진수로 나타냈을 때, 그 이진수의 모든 비트를 반전시킨 수 ( 0 <-> 1 )

  - 2의 보수: 2의 제곱수에서 빼서 얻은 이진수

  ex) 2진수 3의 2의 보수: 11 -> 01

  - 2진수에서 2의 보수를 쉽게 구하려면

   1) 자리수를 모두 바꿔주고, 11 -> 00

   2) 1을 더해준다. 00 -> 01

      따라서, 3의 2의 보수는 01

  Ex)

<hide/>
public class Sam01{
    public static void main(String[] args){
        int i1 = 5;
        int i2 = ~i1 + 1;
        System.out.println(i1);
        System.out.println(i2);
    }
}

  Note) 실행 결과

'Java > Java의 정석' 카테고리의 다른 글

Chapter 06 객체지향 프로그래밍 I  (0) 2022.02.22
Chapter 05 배열(Array)  (0) 2022.02.20
Chapter 04 조건문과 반복문  (0) 2022.02.19
Chapter 02 변수(Variable)  (0) 2022.02.17
Chapter 01 자바를 시작하기 전에  (0) 2022.02.15