[Java] 연산자 모음
* 연산자 종류
1. 산술 연산자 +, -, /, *, %
2. 대입 연산자 =
3. 복합 대입 연산자 +=, -=, /=, *=, %=, &=, |=, ^=
4. 증감 연산자 ++, --
5. 비교 연산자 ==, !=, >, <, <=, >=, instanceof, equals
6. 비트 연산자 &, |, ^, ~
7. 시프트 연산자 >>, >>>, <<
8. 논리 연산자 &&, ||
1. 산술 연산자
- ex) int, long
1 + 1 = 2 더하기
1 - 1 = 0 빼기
1 / 1 = 1 나누기
1 * 1 = 1 곱하기
1 % 2 = 1 나머지
- ex) float, double(int, long과 float, double을 같이 연산하면 소수점 까지 나온다.)
1.0 + 1.0 = 2.0
1.0 - 1.0 = 0.0
1.0 / 1.0 = 1.0
1.0 * 1.0 = 1.0
1.0 % 1.0 = 0.0
1 + 1.0 = 2.0
1 - 1.0 = 0.0
1 / 1.0 = 1.0
1 * 1.0 = 1.0
1 % 1.0 = 0.0
- 문자열과 연산 : +연산 외에는 에러가 난다. +연산시 문자열이 된다.
"1" + 1 = "11"
2. 대입 연산자
int a = 2; 변수 a에 2를 대입한다.
3. 복합 대입 연산자
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
4. 증감 연산자
++a -> 1을 더한 후 사용
int a = 1;
System.out.println(++a); // 2
a++ -> 사용 후 1을 더함
int a = 1;
System.out.println(++a); // 1
System.out.println(a); // 2
--도 ++와 사용법은 같다.
5. 비교 연산자
< a와 b가 숫자이고 a 연산자 b 일 때의 비교 >
1 == 1 -> true, 1 == 2 -> false // 같은 수인지 비교
1 != 2 -> true, 1 != 1 -> false // 같은 수가 아닌지 비교
2 > 1 -> true, 1 > 1 -> false, 1 > 2 -> false // 초과
1 < 2 -> true, 1 < 1 -> false, 2 < 1 -> false // 미만
2 >= 1 -> true, 1 >= 1 -> true, 1 >= 2 -> false // 이상
1 <= 2 -> true, 1 <= 1 -> true, 2 <= 1 -> false // 이하
< 변수가 객체의 인스턴스인지 비교 >
Integer b = new Integer(1);
b instanceof Integer -> true, b instanceof Long -> false
< 문자열이 같은지 비교 >
"a".equals("a") -> true, "a".equals("b") -> false // 문자열이 객체이기 때문에 == 으로 비교하면 안된다.
6. 비트 연산자
int a = 120, b = 240;
a의 비트 = 0 1 1 1 1 0 0 0
b의 비트 = 1 1 1 1 0 0 0 0
& : 논리곱 -> 두 비트가 1 이면 1 아니면 0
a & b = 112
a & b 연산 후 비트 = 0 1 1 1 0 0 0 0
| : 논리합 -> 두 비트가 0이면 0 아니면 1
a | b = 248
a | b 연산 후 비트 = 1 1 1 1 1 0 0 0
^ : 배타적 논리합 -> 두 비트가 같으면(1,1 / 0,0) 0 아니면 1
a ^ b = 136
a ^ b 연산 후 비트 = 1 0 0 0 1 0 0 0
~ : 1의 보수
~a = -121
7. 시프트 연산자
a = 65;
b = 129;
c = -64;
a의 비트 = 1 0 0 0 0 0 0 1
b의 비트 = 0 1 0 0 0 0 0 1
c의 비트 = 1 1 0 0 0 0 0 0
a >> b -> a를 b만큼 비트를 오른쪽으로 움직인다. 새로운 비트는 0을 추가한다. (음수일 경우 부호비트가 고정이다.)
a >> 1 -> 32
a >> 1 연산 후 비트 -> 0 0 1 0 0 0 0 0
b >> 1 -> 64
b >> 1 연산 후 비트 -> 0 1 0 0 0 0 0 0
c >> 1 -> -32
c >> 1 연산 후 비트 -> 1 0 1 0 0 0 0 0
a >>> b -> a를 b만큼 비트를 오른쪽으로 움직인다. 새로운 비트는 0을 추가한다. (음수일 경우 부호비트도 움직인다.)
a >>> 1 -> 32
a >>> 1 연산 후 비트 -> 0 0 1 0 0 0 0 0
b >>> 1 -> 64
b >>> 1 연산 후 비트 -> 0 1 0 0 0 0 0 0
c >>> 1 -> 2147483616
c >>> 1 연산 후 비트 -> ........
% 주의점 %
위에서 c >>> 1을 했는데 값이 크게 나오는 이유는 시프트 연산을 할 때 int 형 즉 32비트로 연산이 되기 때문이다. 그래서 임의로 형변환을 한다면 원치않는 값이 나올 수 있다.
a << b -> a를 b만큼 비트를 왼쪽으로 움직인다. 새로운 비트는 0을 추가한다.
a << 1 -> 130
a << 1 연산 후 비트 -> 1 0 0 0 0 0 1 0
b << 1 -> 258
b << 1 연산 후 비트 -> 1 0 0 0 0 0 0 1 0
8. 논리 연산자
&&는 false로 시작하면 무조건 false이다. (그리고)
true && true -> true
true && false -> false
false && true -> false
false && false -> false
||는 true로 시작하면 무조건 true이다. (또는)
true || true -> true
true || false -> true
false || true -> true
false || false -> false