자바(3) - 연산자
2021년07월07일연산자란
연산자란 연산에 사용되는 기호이며, 항은 연산에 사용되는 값을 의미한다. 예를 들어 3+4가 있으면, 3과 4는 항이고 +가 더하기 연산자이다. 연산자는 크게 단항, 이항, 삼항 연산자가 있다.
| 연산자 | 설명 | 연산 예 |
|---|---|---|
| 단항 연산자 | 항이 한 개 | ++num |
| 이항 연산자 | 항이 두 개 | num1+num2 |
| 삼항 연산자 | 항이 세 개 | (5>3) ? 1:0 |
증가, 감소 연산자
단항 연산자로 값을 1만큼 늘리거나 줄일 때 사용한다.
| 연산자 | 기능 | 연산 예 |
|---|---|---|
| ++ | 항의 값에 1을 더함 | val=++num // 먼저 num값이 1 증가 후 val 변수에 대입 val = num++ // val 변수에 기존 num값을 대입 후 1증가 |
| – | 항의 값에 1을 뺌 | val = –num val = num– |
관계 연산자
이항 연산자로 두 개의 항 중 어느 것이 큰지, 작은지, 같은지 여부 판단 시 사용한다. 결과 값으로는 boolean값인 true와 false를 반환한다. |연산자|기능| |—–|—-| |>|왼쪽이 오른쪽보다 크면 참, 아니면 거짓| |<|왼쪽이 오른쪽보다 작으면 참, 아니면 거짓| |>=|왼쪽이 오른쪽보다 크거나 같으면 참, 아니면 거짓| |<=|왼쪽이 오른쪽보다 작거나 같으면 참, 아니면 거짓| |==|두 개 항이 같으면 참, 아니면 거짓| |!=|두 개 항이 다르면 참, 아니면 거짓|
논리 연산자
두 항을 비교하여 참 거짓을 판단한다. 관계 연사자와 함께 사용한다. |연산자|기능| |—–|—-| |&& (논리 곱)|두 항이 모두 참인 경우에만 참. 그 외에는 모두 거짓이다.| ||| (논리 합)|두 항 중 하나의 항만 참이면 참. 두 항이 모두 거짓일 때 거짓이다.| |! (부정)|단항 연산자로 참인 경우 거짓으로, 거짓인 경우 참으로 바꿔준다.|
단락 회로 평가
논리 연산자를 사용할 때 논리 곱(&&) 연산은 두 항이 모두 참일 때만 결과 값이 참이 된다. 즉 하나라도 거짓이면 결과가 거짓이 된다. 논리 합(||)은 하나만 참이면 나머지와 상관없이 참인데 이런 특성 때문에 특이한 일이 벌어진다.
int num1 = 10;
int i = 2;
boolean value = ((num1 = num1 + 10) < 10) && ((i = i + 2) < 10);
System.out.println(value);
System.out.println(num1);
System.out.println(i);
value = ((num1 = num1 + 10) > 10) || ((i = i + 2) < 10);
System.out.println(value);
System.out.println(num1);
System.out.println(i);
위의 코드의 실행 결과를 보면 다음과 같다.
false 20 2 true 30 2
이렇게 나오는 이유는 첫 번째 value의 (num1 = num1 + 10) < 10 부분때문이다. num1에 10을 더해 20이 되고 이것이 10보다 작냐인데, 거짓이 나온다. 이어서 나오는 &&연산에 의하면 첫 번째가 거짓이니 두 번째는 볼 것도 없이 판단하지 않는다. 그렇기에 i는 계산이 되지 않는다.
두 번째 value는 ||연산이 나오는데, 이번에는 (num1 = num1 + 10) > 10) 이 부분이 참이기에 뒤에거를 판단하지 않아 i가 계산되지 않는다. 이처럼 논리 곱이나 합 연산 시 두 항을 모두 실행하지 않아도 결과 값을 알 수 있으면, 나머지 항은 실행되지 않는데 이것을 단락 회로 평가(Short Circuit Evaluation:SCE)라고 한다.
복합 대입 연산자
대입 연산자와 다른 연산자를 조합해 하나의 연산자처럼 사용하는 것을 말한다. |연산자|기능|연산 예| |—–|—-|—–| |+=|두 항의 값을 더해 왼쪽 항에 대입|num1 += 2;| |-=|두 항의 값을 빼서 왼쪽 항에 대입|num1 -= 2;| |*=|두 항의 값을 곱해서 왼쪽 항에 대입|num1 *= 2;| |/=|왼쪽 항을 오른쪽 항으로 나누어 몫을 왼쪽 항에 대입|num1 /= 2;| |%=|왼쪽 항을 오른쪽 항으로 나누어 나머지를 왼쪽 항에 대입|num1 %= 2;|
조건 연산자
삼항 연산자이다. 주어진 조건식이 참인 경우와 거짓인 경우 다른 결과 값이 나온다. |연산자|기능|연산 예| |—–|—–|——| |조건식?결과1:결과2|조건식이 참이면 결과1, 조건식이 거짓이면 결과2가 선택됨|int num = (5>3)?10:20;|
비트 연산자
비트 연산자는 비트 단위로 연산이 이루어지는 연산자이다. 비트 연산을 이용하면 어떤 수의 2배수, 4배수 만들어 속도를 빠르게 할 수도 있다.
비트 논리 연산자
비트 단위로 &, |, ^, ~ 연산이 이루어진다.
&(AND) 연산자
두 개의 비트 값이 모두 1인 경우에만 1이 된다.
int num1 = 5;
int num2 = 10;
int result = num1 & num2;
을 예시로 들어 보자. 각 num들을 비트로 풀어보면 num1: 00000101 num2: 00001010 각 자리마다 비교하여 둘 다 1일 시만 1이 된다. 결과: 00000000
|(OR) 연산자
하나라도 1이면 1이 된다. 위 예시대로 해보며 하나라도 1이면 1이 된다. 결과: 00001111
^(XOR) 연산자
비트가 같은 값이면 0을 다른 값이면 1이 된다. X가 exclusive라는 배타적인 의미인데 서로 배타된단 의민듯 하다. 결과: 00001111
~(반전) 연산자
1은 0으로 0은 1로 반전 해주면 된다.
int num = 10;
int result = ~num;
num은 00001010이 되고 result는 11110101이 된다. 부호비트가 1로 바뀌어서 음수가 되었는데, 음수는 양수로 변환해야 얼마인지 알기에 2의 보수를 취해본다. 00001010(1의 보수) -> 00001011(2의 보수) 즉 -11이 된다.
비트 이동 연산자
«, », »> 세가지가 사용 된다. 이를 시프트(shift)연산자라고도 한다.
« 연산자
왼쪽으로 비트를 이동한다는 의미이다.
int num = 5;
num << 2;
num은 00000101인데 이를 2비트씩 왼쪽으로 미는 것이다. 그러면 00010100이 되고 20이 된다. n비트 왼쪽 이동한다는 것은 기존 값에 n^2만큼 곱해지는 뜻이다.
» 연산자
오른쪽으로 비트를 이동하는 연산자이다. 위의 예시서 «를 »로 바꿔보자. 00001010이 있으면 오른쪽으로 2비트씩 이동한다. 그러면 0000010이 된다. 오른쪽으로 n비트 이동하면 n^2만큼 나뉘는 것이다.
»> 연산자
>>와 마찬가지로 비트를 오른쪽으로 이동하는 것인데, 왼쪽에 채워지는 비트값은 부호 비트와 상관없이 무조건 0이 된다.
미소여우의 주석달기