Page last modified: Mar 26 2021
목표
자바가 제공하는 다양한 연산자 학습하기
Table of contents
연산자 (Operator)
연산을 위한 기호, 심볼
이항 연산자 (Binary Operator)두 개의 operands가 있어야 하는 연산자단항 연산자 (Unary Operator)한 개의 operand에 대해 연산을 수행
산술 연산자 (Arithmetic Operators)
- 연산 가능 데이터 타입: char, byte, short, int, long, float, double
- char, byte, short형 연산 시 JVM Specification에 따라 int형으로 프로모션되기 때문에
타입 캐스팅을 해주거나 결과를 저장하는 변수의 타입을 int로 설정해야 함 - 정수형 간 나누기의 경우 계산 결과가 실수값이더라도, 두 operands는 정수형이기 때문에 결과는 정수값이다
- 두 operands의 타입이 다를 경우, 범위가 큰 타입을 따라 나머지 하나가 타입 프로모션된다
종류
Addition(+)String 연결 연산자로도 쓰임
System.out.println("Total: " + 3 + 4); // Total: 34
Subtraction(-)Multiplication(*)Division (/)0 또는 0.0으로 나눌 경우
System.out.println(0/0); // java.lang.ArithmeticException: / by zero
System.out.println(1/0); // java.lang.ArithmeticException: / by zero
System.out.println(0.0/0); // NaN
System.out.println(1.0/0); // Infinity
System.out.println(-1.0/0.0); // -Infinity
Modulo(%)
비트 연산자 (Bitwise Operators)
- 비트 간 연산을 수행
- 연산 가능 데이터 타입: 0과 1로 표현 가능한 정수형
| 연산자 | 논리 |
|---|---|
| & | AND, 두 비트가 모두 1일 경우 1 |
| | | OR, 두 비트 중 하나가 1일 경우 1 |
| ^ | XOR, 한 비트가 1이고 나머지 한 비트가 0 경우 1 |
| ~ | NOT, 비트 보수 (0 ⇔ 1) |
0101 0101 0101
& 1001 | 1001 ^ 1001 ~ 0101
------ ------ ------ ------
0001 1101 1100 1010
비트 이동 연산자 (Shift Operators)
<number> <operator> <num of shift>
⇒ <number>를 2진수(int는 32-bit, long은 64-bit)로 바꾼 후 shift
| 연산자 | 연산식 | 동작 |
|---|---|---|
| << | num << n | Left shift n개 만큼 비트를 왼쪽으로 밀기 오른쪽 비트는 0으로 채움 ⇒ 부호 유지, num * 2^n과 결과 동일 |
| >> | num >> n | Signed right shift n개 만큼 비트를 오른쪽으로 밀기 왼쪽 비트는 부호 비트로 채움 ⇒ 부호 유지, num이 양수면 num / 2^n과 결과 동일 |
| >>> | num >>> n | Unsigned right shift shift 수 만큼 비트를 오른쪽으로 밀기 왼쪽 비트는 0으로 채움 ⇒ 음수의 경우 부호 바뀜, num이 양수면 num / 2^n과 결과 동일 |
💡 음수의 2진수 표현에는 2의 보수법이 사용된다
10 << 2 // 00000000 00000000 00000000 00001010 << 2 = 00000000 00000000 00000000 00101000 = 40 = 10 * 2^2
-1 << 2 // 11111111 11111111 11111111 11111111 << 2 = 11111111 11111111 11111111 11111100 = -4 = -1 * 2^2
10 >> 2 // 00000000 00000000 00000000 00001010 >> 2 = 00000000 00000000 00000000 00000010 = 2 = 10/4
-1 >> 2 // 11111111 11111111 11111111 11111111 >> 2 = 11111111 11111111 11111111 11111111 = -1
10 >>> 2 // 00000000 00000000 00000000 00001010 >>> 2 = 00000000 00000000 00000000 00000010 = 2 = 10/4
-1 >>> 2 // 11111111 11111111 11111111 11111111 >>> 2 = 00111111 11111111 11111111 11111111 = 1073741823
참고 링크
https://coding-factory.tistory.com/521
https://www.geeksforgeeks.org/bitwise-operators-in-java/
관계 연산자, 비교 연산자 (Comparison Operators)
두 operands를 비교하여 true 또는 false를 반환
<><=>=primitive type 사용 (boolean 제외)==!=값을 비교하거나 두 operands가 reference type일 경우 객체의 주소값을 비교
⭐️ String type은A.equals(B)로 비교
논리 연산자 (Logical Operators)
두 항을 비교하여 true 또는 false를 반환
| 연산자 | 연산식 | 동작 |
|---|---|---|
| && | x < 1 && y > 3 | 두 항이 모두 참인 경우 true 앞 항이 거짓이면 뒷 항은 체크X ⇒ 단락 회로 평가(Short Circuit Evaluation) |
| || | x < 1 || y > 3 | 두 항 중 하나가 참인 경우 true 앞항이 참이면 뒷 항은 체크X ⇒ 단락 회로 평가(Short Circuit Evaluation) |
| ! | !(x < 1) | 참인 경우 false, 거짓인 경우 true |
instanceof 연산자
<instance> instanceof <clss><instance>가<class>형인지 판단
∴ known as “Type Comparison Operator”- is-a relationship이 성립한다면 true를 반환
참고 Inheritance (IS-A) vs. Composition (HAS-A) Relationship
대입 연산자 (Assignment Operator)
=+=-=*=/=%=
새로 알게 된 것 ↓
| 연산자 | 연산식 | 풀어 쓴 식 |
|---|---|---|
| &= | x &= 3 | x = x & 3 |
| |= | x |= 3 | x = x | 3 |
| ^= | x ^= 3 | x = x ^ 3 |
| >>= | x >>= 3 | x = x >> 3 |
| <<= | x <<= 3 | x = x <<3 |
출처 https://www.w3schools.com/java/java_operators.asp
화살표 연산자 -> (Lambda Arrow Operator)
람다식에 쓰이는 연산자
람다식(Lambda Expression)
익명 클래스처럼 이름(식별자, identifier)이 없는 메소드
// Syntax (parameter) -> { method body }
(a, b) -> { return (a >= b) ? a : b; }
event -> System.out.println("Welcome!")
3항 연산자 (Ternary Operator)
Syntax <if statement> ? <true case> : <false case>
⇒ 조건문의 결과에 따라 <true case> 또는 <false case> 를 반환
- 간단한 if-else 구문의 경우 3항 연산자를 사용하여 간결하게 표현할 수 있다
- 중첩 사용도 가능하지만 가독성을 위해 지양하는 것이 좋다
int max = (a >= b) ? a : b;
public int getMax(int a, int b) {
return (a >= b) ? a : b;
}
연산자 우선 순위
| 우선순위 | 연산자 |
|---|---|
| 0 | 괄호로 묶인 연산 () |
| 1 | postfix ++ -- |
| 2 | infix ++ --부호 + -단항 연산자 ~ ! |
| 3 | 산술 연산자 * / % |
| 4 | 산술 연산자 + - |
| 5 | 비트 이동 연산자 << >> >>> |
| 6 | 비교 연산자 < > <= >=타입 비교 연산자 instanceof |
| 7 | 비교 연산자 == != |
| 8 | 비트 연산자 & |
| 9 | 비트 연산자 ^ |
| 10 | 비트 연산자 | |
| 11 | 논리 연산자 && |
| 12 | 논리 연산자 || |
| 13 | 3항 연산자 ? |
| 14 | 대입 연산자 = += -= *= /= %= &= ^= |= <<= >>= >>>= |
참고 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
Java 13. switch 연산자 (Switch Expression)
- 화살표 연산자
->사용: 다음 case로 진행하지 않도록 하는 break문이 필요 없어짐 - switch expression의 값 명시를 위한 break문을
yield키워드로 변경하여 사용
참고 https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }
Day day = Day.WEDNESDAY;
// e.g. for 1
System.out.println(
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Invalid day: " + day);
}
);
// e.g. for 2
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> {
System.out.println(6);
yield 6;
}
case TUESDAY -> {
System.out.println(7);
yield 7;
}
case THURSDAY, SATURDAY -> {
System.out.println(8);
yield 8;
}
case WEDNESDAY -> {
System.out.println(9);
yield 9;
}
default -> {
throw new IllegalStateException("Invalid day: " + day);
}
};