연산자의 종류
자료형 | 연산 기호 | 기능 | 결과 |
산술 연산자 | +, -,*, /, % | 사칙연산 및 나머지 연산 | 값 |
증감 연산자 | ++, -- | 값이 1씩 증가 및 감소 | |
비트 연산자 | &, |, ~, ^ | 비트 AND, OR, NOT, XOR | |
시프트 연산자 | >>, <<, >>> | 비트 단위의 이동 | |
비교 연산자 | <, >, <=, >=, ==, != | 값의 크기 비교 | 참 또는 거짓 |
논리 연산자 | &&, ||, !, ^ | 논리 AND, OR, NOT, XOR | |
대입 연산자 | =, +=, -=, *=, /=, &=, |=, >>=, <<=, >>>= | 산술 연산 결과의 대입 ('연산자' + '='의 축약 표현) |
실행 |
삼항 연산자 | (참 또는 거짓) ? x : y | 참일 때 x, 거짓일 때 y |
산술 연산자와 증감 연산자
산술연산자는 사칙 연산(+, -,*, /)과 나머지 연산(%, 모듈로modulo 연산)이 있다. 증감 연산자(++, --)는 변숫값을 1씩 증가 또는 감소시킨다. 증감 연산자는 위치에 따라 변수 앞에 붙는 '전위형', 변수 뒤에 붙는 '후위형' 으로 나뉜다. 전위형은 다른 모든 명령보다 먼저 실행하고, 후위형은 가장 나중에 실행된다.
비트 연산자
비트 연산자는 말 그대로 비트 단위 연산자로 AND(&), OR(|), XOR(^), NOT(~)이 있다. 진리표는 아래 표와 같다.
값1 | 값2 | AND(&) | OR(|) | XOR(^) |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
값 | NOT(~) |
0 | 1 |
1 | 0 |
실제 비트 연산을 수행할 때의 최소 단위는 int(4byte = 32bit)이다. 10진수 3을 2진수로 변환하면 0이 30개, 1이 2개인 32비트 2진수로 변환되는데, 앞의 0들은 연산 결과에 영향을 미치지 않으므로 생략 가능하다. 즉, '0b00000000000000011 == 0b0011'가 성립한다. AND는 둘 다 1일 때 1, OR은 하나라도 1이면 1, XOR은 서로 같으면 0, 다르면 1이다. NOT 0은 1로 1은 0으로 반전시킨다. 참고로 컴퓨터에서 값을 읽는 방법에 대해 알아보자면, 값의 첫 번째 비트는 부호비트이고 나머지 비트가 값이다. 이 때, 양수는 1을 기준으로 값을 읽는다. 반면, 음수는 0을 기준으로 값을 읽은 후에 1을 더한 값이 절댓값이 된다. 예를 들어, 2진수00...001010은 양수이므로 1을 기준으로 읽게 되며, 읽은 값은 +10(23 + 21)을 의미한다. 반면 11...11010은 음수이므로 0을 기준으로 읽은 값에 1을 더한 값인 6(22 + 20 + 1)에 음의 부호를 붙인 값(-6)으로 읽어들인다. 음수에 이렇게 1을 이유는 1을 더하지 않으면 0에 대한 표현이 2개가 나오므로 1을 더한 값에 음의 부호(-)를 붙인다.
시프트 연산자
시프트 연산자는 비트의 위치를 좌우로 이동하는 연산으로, 산술 시프트(<<, >>)와 논리 시프트(>>>)가 있다. 산술 시프트는 숫자의 부호 비트를 유지하면서 나머지 비트를 왼쪽(<<) 또는 오른쪽(>>)으로 이동하는 연산자다. << 연산을 수행하면 부호 비트를 제외한 나머지 전체 비트가 왼쪽으로 이동하므로, 1bit 이동할 때 마다 X2의 효과가 있다. 반대로, >>연산을 수행하면 오른쪽으로 이동하므로, 1bit 이동할 때 마다 ÷2의 효과가 있다. 연산을 수행하면서 생긴 빈 칸은 모두 0으로 채워진다. 그래서 >> 연산에서는 삭제되는 비트 때문에 2로 나눈 결과와 다르게 나올 수 있다. '0b0011 >> 1'을 연산하면 1.5가 아닌 1이 출력되는 경우를 예로 들 수 있다.
연산자 | 부호 | 특성 |
<< | 양수, 음수 | 1bit 시프트당 x2, 부호 유지 |
>> | 양수 | 1bit 시프트당 ÷2, 부호 유지, 소수 버림 |
음수 | 1bit 시프트당 ÷2, 부호 유지, 소수 올림 |
논리 시프트(>>>)는 부호 비트를 포함해 전체 비트를 오른쪽으로 이동시키는 연산이다. 빈 칸은 0으로 채우며, 음수는 양수로 변한다. 이러한 논리 시프트는 특정 비트 위치에서의 값에 의미가 있을 때 주로 사용하는 연산으로 숫자의 크기나 부호는 의미가 없다.
비교 연산자
비교 연산자는 크게 크기 비교(<, >, <=, >=)와 등가 비교(==, !=)로 나눌 수 있다. 연산 결과는 불리언 자료형(true, false)이다. 비교 연산자에서 등가 비교를 할 때 비교 대상은 스택 메모리의 값이다. 기본 자료형은 스택 메모리에 실제 값이 저장되지만, 참조 자료형의 실제 값은 힙 메모리에 저장되고 스택 메모리는 힙 메모리의 번짓값이 저장되기 때문에 번짓값과 비교하게 된다.
논리 연산자
논리 연산자는 비트 연산자와 비슷하지만, 피연산자로 불리언값만 올 수 있고, 결과 또한, 불리언 타입만을 지닌다. 진리표는 아래와 같다.
값1 | 값2 | AND(&) | OR(|) | XOR(^) |
false | false | false | false | false |
false | true | false | true | true |
true | false | false | true | true |
true | true | true | true | false |
값 | NOT(~) |
false | true |
true | false |
0과 1이 false와 true로 바뀐 셈이다. 비트 연산자에 불리언 값을 두면 논리 연산자와 같은 기능을 수행한다. 이 두 가지 연산의 차이점은 쇼트 서킷short circuit의 적용 여부다. 쇼트 서킷은 연산을 수행하는 과정에서 결과가 이미 확정되엇을 때 나머지 연산을 생략하는 것을 말한다. 논리 연산자로 연산 수행할 때는 쇼트 서킷이 적용되지만, 비트 연산자는 적용되지 않는다. 불필요한 계산을 생략해서 좋은 경우도 있지만, 비교 대상에 있는 명령어 자체를 수행하지 않으므로 주의해서 사용해야 한다. 한편, 논리 XOR(^)은 양쪽 값을 모두 확인해야 하기 때문에 구조적으로 쇼트 서킷 적용이 불가능하다. 그래서 논리 XOR(^)과 연산 기호가 동일하다.
대입 연산자
대입 연산자는 오른쪽 피연산자의 연산 결과를 왼쪽 변수에 대입하는 연산자이다. 대입 연산자는 다른 연산자와 결합해 축약된 형테로 사용할 수 있다. (a = a + 3)이 일반 표현인데 이를 간단하게 오른쪽 변수(a)가 사라진 축약 표현(a += 3)을 사용할 수 있다.
일반 표현 | 축약 표현 |
a = a + b | a += b |
a = a - b | a -= b |
a = a * b | a *= b |
a = a / b | a /= b |
a = a % b | a %= b |
a = a & b | a &= b |
a = a | b | a |= b |
a = a >> b | a >>= b |
a = a << b | a <<= b |
a = a >>> b | a >>>= b |
삼항 연산자
자바에서 유일하게 3개의 피연산자가 있는 연산자다. '(참 또는 거짓) ? 참일 때 : 거짓일 때' 형식으로 이루어진다. 물음표앞에는 불리언 자료형만 올 수 있다. 주로 논리 연산자와 비교 연산자를 사용, true일 땐 콜론(:) 앞, false일 땐 뒤쪽이 연산 결과가 된다.
'development > Java' 카테고리의 다른 글
JAVA 공부 해볼까 (7) (2) | 2021.12.13 |
---|---|
JAVA 공부 해볼까 (6) (0) | 2021.12.11 |
JAVA 공부 해볼까 (4) (4) | 2021.12.09 |
JAVA 공부 해볼까 (3) (2) | 2021.12.07 |
JAVA 공부 해볼까 (2) (4) | 2021.12.06 |