자바의 연산자는 연산 결과의 특징에 따라 3가지로 나눌 수 있다.
- 연산 결과가 특정값이 나오는 산술, 증감, 비트, 시프트 연산자
- 연산 결과가 참(true)와 거짓(false) 중 하나의 값으로만 나타내는 비교, 논리 연산자
- 값을 반환하는 것이 아닌 값을 대입하는 의미를 지닌 대입 연산자와 삼항 연산자가 있다.
자료형 | 연산 기호 | 기능 | 결과 |
산술 연산자 | +, -, *, /, % | 사칙연산 및 나머지 연산 | 값 |
증감 연산자 | ++, -- | 값이 1씩 증가 및 감소 | |
비트 연산자 | &, |, ~, ^ | 비트 AND, OR, NOT, XOR | |
시프트 연산자 | >>, <<, >>> | 비트 단위의 이동 | |
비교 연산자 | <, >, <=, >=, ==, != | 값의 크기 비교 | 참 또는 거짓 |
논리 연산자 | &&, ||, !, ^ | 논리 AND, OR, NOT, XOR | |
대입 연산자 | =, +=, -=, *=, /=, &=, |=, >>=, <<=, >>>= | 산술 연산 결과의 대입 ('연산자' + '='의 축약 표현) |
실행 |
삼항 연산자 | 참 또는 거짓 ? x : y | 참일때 x, 거짓일 때 y |
연산자의 연산 방법
1. 산술 연산자와 증감 연산자
산술 연산자는 사장 기본적인 연산자로, 사칙연산과 나머지연산( % ) 이 있다. 이중 정수 / 정수 형태의 연산을 할때 주의 해야 한다.
int / int 의 결과는 int 이므로 5 / 2 의 값은 2.5가 아니라 2 이다. 즉 '정수 / 정수' 의 결과는 나눗셈의 몫이다.
이와 달리 나머지 연산 ( % ) 은 말 그대로 나누기를 수행한 이후의 나머지를 나타내는데, 이를 '모듈로 연산' 이라고 한다.
증감 연산자 ( ++, -- ) 는 변수 값을 1씩 증가 또는 감소 시킨다. a++의 의미는 a = a+1 과 동일하며 현재 a값을 1 증가시켜 다시 a에 저장하라는 의미이다.
증감 연산자는 전위형과 후위형으로 나뉘는데 둘의 차이는 실행의 우선순위이다.
전위형은 다른 모든 명령보다 먼저 실행되고, 후위형은 가장 나중에 실행된다.
int num1 = 3;
int num2 = ++num1; // num1 값에 1을 더한 후 대입 (전위형)
System.out.println(num1) // 4
System.out.println(num2) // 4
int num3 = 3;
int num4 = num1++; // num1 값을 대입후 num1에 1을 더하기 (후위형)
System.out.println(num1) // 4
System.out.println(num2) // 3
2. 비트 연산자
비트 연산자는 말 그대로 비트단위의 연산자로 AND( & ), OR( | ), XOR( ^ ), NOT( ~ )이 있다.
비트 AND은 두 값이 모두 1일때만 1인 연산자, 비트 OR은 두값이 모두 0일 때만 0인 연산자다.비트 XOR은 두 값이 같을 떄 0, 다를 때 1 인 연산자이며, 비트 NOT 은 0은 1 , 1은 0으로 반전하는 연산자다.
값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 |
이는 코드에서도 적용된다.
// AND 연산
System.out.println(3 & 10) // 2
System.out.println(0b00000011 & 0b00001010) // 2
// OR 연산
System.out.println(3 | 10) // 11
System.out.println(0b00000011 | 0b00001010) // 11
// XOR 연산
System.out.println(3 ^ 10) // 9
System.out.println(0b00000011 ^ 0b00001010) // 9
// NOT 연산
System.out.println(~3) // -4
System.out.println(~0b00000011) // -4
3. 시프트 연산자
시프트 연산자는 비트의 위치를 좌우로 이동하는 연산으로, 산술 시프트 ( <<, >> ) 와 논리 시프트 ( >>> ) 가 있다.
산술 시프트는 숫자의 부호 비트는 유지하면서 나머지 비트를 왼쪽, 오른쪽으로 이동하는 연산자 이다.
<< 연산을 수행하면 부호비트를 제외한 나머지 전체 비트가 왼쪽으로 이동하므로 1bit 이동할때마다 X2의 효과가 있다.
반면 >>연산을 수행하면 부호 비트를 제외한 나머지 전체 비트가 오른쪽으로 이동하므로 이동할때마다 ÷2의 효과가 있다.
양수와 음수의 연산 결과에는 차이가 있는데, 양수는 X2가 그대로 유지되는 반면, 음수는 소수를 버리거나 올리게 된다.
이는 최하위 비트값이 시프트 과정에서 삭제되기 때문이다.
연산자 | 부호 | 특성 | 예 |
<< | 양수, 음수 | 1bit 시프트당 X 2 , 부호 유지 | 3 << 1 = 6 -3 >> 1 = -6 |
>> | 양수 | 1bit 시프트당 / 2 , 부호 유지, 소수 내림 |
5 >> 2 = 1 |
음수 | 1bit 시프트당 / 2, 부호 유지, 소수 올림 |
- 5 >> 2 = -2 |
// <<
System.out.println(3 << 1); // 6
System.out.println(3 << 1); // -6
// >>
System.out.println(5 >> 1); // 2
System.out.println(5 >> -1); // -3
// 논리 시프트
System.out.println(3 >>> 1); // 1
System.out.println(-3 >>> 31); // 1
4. 비교 연산자
비교 연산자는 크기를 비교하는 연산자( <, >, <=, >= )와 등가를 비교하는 연산자 ( ==, != ) 로 나눌 수 있다.
연산결과는 true 와 false 중 하나를 나타낸다.
참고로 등호 ( = ) 를 포함한 2개의 연산 부호가 연결 됐을 때 등호는 항상 오른쪽에 위치한다.
int a = 5;
int b = 2;
int c = 5;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < c); // false
System.out.println(a > b); // true
System.out.println(a <= b); // false
System.out.println(a >= c); // true
//참조 자료형 등가 비교
String str1 = new String("hi");
String str2 = new String("hi");
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2); //true
참조 자료형도 등가를 비교할 수 있는데 이는 스택메모리 값을 비교하기 때문에 두 문자열을 비교하기 위해선 .equals( ) 메서드를 사용해야 한다.
5. 논리 연산자
논리 연산자는 비트 연산자와 매우 비슷하지만, 피연산자로 불리언값만 올 수 있고, 연산 결과 또한 불리언 타입만을 지닌다.
논리 AND( && ) 는 두 값이 모두 true일 때만 true, 나머지는 모두 false 값을 지닌다
논리 OR( || ) 는 두 값이 모두 fasle 일 때만 false 이며 나머지는 모두 true 값을 가진다.
논리 XOR( ^ )은 두 값이 다를 때는 true, 같을 때는 false 의 결과를,
논리 NOT( ! )은 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 에 대응해 생각하면 매우 비슷하다.
'java' 카테고리의 다른 글
[JAVA] 야구게임 맞추기 (0) | 2022.07.30 |
---|---|
[JAVA] 배열의 생성과 자료형 (0) | 2022.07.09 |
[JAVA] 제어문 (1) | 2022.07.09 |
[JAVA] 기본 자료형간의 타입변환, 연산 (0) | 2022.07.09 |
[JAVA] 자바의 자료형 (Data Type) (0) | 2022.07.09 |