[Java] 연산자 Operator

Published: by Creative Commons Licence

용어

  • 연산자(Operator): 어떠한 기능을 수행하는 기호
  • 피연산자(Operand): 연산자의 작업 대상

연산자의 종류

  • 단항 연산자: +, -, (type), ++, --, ~, !
  • 이항 산술 연산자: +, -, *, /, %, <<, >>, >>>
  • 이항 비교 연산자: >, <, >=, <=, ==, !=
  • 이항 논리 연산자: &&, ||, &, ^, |
  • 삼항 연산자: ? :
  • 대입 연산자: =, operator=

연산자 우선순위

  • 괄호의 우선순위가 가장 높음
  • 산술 > 비교 > 논리 > 대입
  • 단항 > 이항 > 삼항
  • 연산자의 연산 진행방향은 왼쪽에서 오른쪽
  • 단항, 대입 연산자는 오른쪽에서 왼쪽

단항 연산자 ++ –

  • ++: 증가 연산자. 피연산자의 값 +1
  • --: 감소 연산자. 피연산자의 값 -1

연산자의 위치에 따라 연산 우선순위가 바뀌게 되니 주의할 것.

int n = 1;

int value = n++;
System.out.println(value); //1

int n = 1;
int value = ++n;
System.out.println(value); //2

논리 부정 연산자 !

불리언 타입의 피연산자를 반대로 바꾼다.

boolean flag = true;
flag = !flag;
System.out.println(flag);

int n = 0;
if (n != 1) {
    System.out.println("1이 아니네?");
}

-> false
-> 1 아니네?

비트 전환 연산자 ~

정수를 2진수로 표현했을 때, 1을 0으로 0은 1로 바꾼다. 정수형에서만 사용가능

2진수 10진수
00001010 10
11110101 -11
11110101
00000001
-11
+) 1
11110110 -10
int binary = 0b1111; // 15, 2진수 리터럴(b)
int octal = 011; // 9, 8진수 리터럴
int hexaDecimal = 0xE; // 14, 16진수 리터럴(x)

System.out.println(~binary); // -16
System.out.println(~octal); // -10
System.out.println(~hexaDecimal); // -15

System.out.println(~100); // -101

비트 시프트 연산자 « » »>

비트를 이동하는 연산자. 2n 으로 곱하거나 나눈 결과와 같으며 곱셈, 나눗셈보다 연산속도가 빠르다.

  • x << n: (x * 2ⁿ과 같음)
  • x >> n: (x / 2ⁿ과 같음)
System.out.println(8 << 2); // 8 * (2 ^ 2) = 32
System.out.println(8 >> 2); // 8 / (2 ^ 2) = 2

2진법으로 설명하는게 더 쉽다.

«, left shift operator

x의 비트를 n 만큼 왼쪽으로 이동하면서 새로운 자리는 0으로 채운다:

int a = 9; // 1001
a << 2;    // 100100

», right shift operator

x의 비트를 오른쪽으로 이동하면서 새로운 자리는 x가 양수일 때 0으로, 음수일 땐 1로 채운다:

int a = 9; // 1001
a >> 2;    // 0010, 10진수로 2

int b = -9; // 11111111111111111111111111110111
a >> 2;     // 11111111111111111111111111111101, 10진수로 -3

»>, unsigned right shift operator

x의 비트를 오른쪽으로 이동하면서 새로운 자리는 0으로 채운다.:

int a = 9; // 1001
a >>> 2;   // 0010, 10진수로 2

int b = -9; // 11111111111111111111111110011100
b >>> 2;    // 00111111111111111111111111111101, 10진수로 1073741821

x가 양수인지 음수인지는 판단하지 않으며 양의 정수에 한해 >> 연산자와 결과가 같다.
최상위 비트는 부호를 위한 자리인데 이 자리까지 0으로 채워버린다. 때문에 x가 음수인 경우 >>> 연산 후 양수로 바뀌는 특징이 있음.

비트 연산자 | & ^

피연산자를 비트단위로 연산한다. 실수형을 제외한 모든 기본형에 사용가능

  • |: OR 연산자. 피연산자 중 어느 한 쪽이 1이면 1
  • &: AND 연산자. 피연산자 양 쪽 모두 1이면 1
  • ^: XOR 연산자. 피연산자가 서로 다를 때 1
x y x | y x & y x ^ y
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1
0 0 0 0 0
2진수 10진수
3 | 5 = 7 00000011
00000101
3
5
  00000111 7
3 & 5 = 1 00000011
00000101
3
5
  00000001 1
3 ^ 5 = 6 00000011
00000101
3
5
  00000110 6