💡 산술 연산자는 사칙연산을 다루는 연산자로, 가장 기본적이면서도 가장 많이 사용되는 연산자 중 하나이다.
➡️ 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽 -> 오른쪽이다.
| 산술연산자 | 설명 |
|---|---|
| + | 왼쪽의 피연산자에 오른쪽의 피연산자를 더함 |
| - | 왼쪽의 피연산자에 오른쪽의 피연산자를 뺌 |
| * | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱함 |
| / | 왼쪽의 피연산자에 오른쪽의 피연산자를 나눔 |
| % | 왼쪽의 피연산자에 오른쪽의 피연산자를 나눈 후, 그 나머지를 반환함 |
| 비트연산자 | 설명 |
|---|---|
| x << y | 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다. (빈자리는 0으로 채워짐) |
| x >> y | 정수 x의 각 비트를 x만큼 오른쪽으로 이동시킨다. (빈자리는 정수 a의 최상위 부호비트와 같은 값으로 채워짐) |
| x >>> y | 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다. (빈 자리는 0으로 채워짐) |
⭐️ 예시 : 2 >> 3
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
|---|
➡️ 2를 32비트로 분해한 다음에, 왼쪽으로 3비트를 이동시킨다.
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ? | ? | ? |
|---|
➡️ 빈칸에 들어갈 ?는 0으로 채워지게 되고, 2 >> 3의 결과값은 16이 된다.
💡 관계 연산자라고도 하며, boolean 자료형인 true/false로 반환된다.
| 관계연산자 | 설명 |
|---|---|
| > | 왼쪽 항이 크면 참을, 아니면 거짓을 반환한다. |
| < | 왼쪽 항이 작으면 참을, 아니면 거짓을 반환한다. |
| >= | 왼쪽 항이 오른쪽 항보다 크거나 같으면 참, 아니면 거짓을 반환한다. |
| <= | 왼쪽 항이 오른쪽 항보다 작거나 같으면 참, 아니면 거짓을 반환한다. |
| == | 두 개 항의 값이 같으면 참, 아니면 거짓을 반환한다. |
| != | 두 개 항이 다르면 참, 아니면 거짓을 반환한다. |
💡 논리 연산자는 관계 연산자와 함께 사용되는 경우가 많다. 논리 연산자 역시 결과가 boolean 연산자인 true/false로 반환된다.
| 논리연산자 | 기능 |
|---|---|
| && | 두 항이 모두 참인 경우에만 결과값이 참이다. 그렇지 않은 경우는 거짓이다. |
| || | 두 항 중 하나의 항만 참이면 결과값은 참이다. 두 항이 모두 거짓이면 결과값은 거짓이다. |
| ^ | 두 항 중 하나의 항만 참이고, 다른 하나가 거짓이면 결과값은 참이다. 그렇지 않은 경우는 거짓이다. |
| ! | 단항 연산자이다. 참인 경우는 거짓으로 바꾸고, 거짓인 경우는 참으로 바꾼다. |
💡 instanceof는 객체 타입을 확인하는 연산자이다. 형변환 가능여부를 확인하며, true/false로 결과를 반환한다. 주로 상속 관계에서 부모 객체인지 자식 객체인지 확인하는데 사용한다.
// Class A가 Class B에게 상속을 받았다고 가정
A a = new A();
B b = new B();
System.out.println(a instance A); //true
System.out.println(b instance A); //true
System.out.println(a instance B); //false
System.out.println(b instance B); //true
💡 대입 연산자 (assignment operator)는 변수에 값을 대입할 때 사용하는 이항 연산자이며, 피연산자들의 결합 방향은 오른쪽 -> 왼쪽 이다.
또한, 자바에서는 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 대입 연산자를 제공한다.
| 대입연산자 | 설명 |
|---|---|
| = | 왼쪽의 피연산자에 오른쪽의 피연산자를 대입한다. |
| += | 왼쪽의 피연산자에 오른쪽의 피연산자를 더한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| -= | 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| *= | 왼쪽의 피연산자에 오른쪽의 피연산자를 곱한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| /= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| %= | 왼쪽의 피연산자를 오른쪽의 피연산자로 나눈 후, 그 나머지를 왼쪽의 피연산자에 대입한다. |
| &= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 AND 연산한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| |= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 OR 연산한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| ^= | 왼쪽의 피연산자를 오른쪽의 피연산자와 비트 XOR 연산한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| <<= | 왼쪽의 피연산자를 오른쪽의 피연산자 만큼 왼쪽으로 shift 한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| >>= | 부호를 유지하며 왼쪽의 피연산자를 오른쪽의 피연산자 만큼 오른쪽으로 shift 한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
| >>>= | 부호에 상관없이 왼쪽의 피연산자를 오른쪽의 피연산자 만큼 오른쪽으로 shift 한 후, 그 결과값을 왼쪽의 피연산자에 대입한다. |
💡 화살표 연산자는 Java 8부터 람다식(Lamda Expressions)을 지원하면서, 람다식의 기본 문법으로 사용되고 있는 연산자이다.
➡️ 람다식은 일종의 익명 함수라고 할 수가 있는데, 익명 함수를 이해하기 위해서는 먼저 익명 클래스(Anonymous class)의 개념을 이해해야 한다.
⭐️ 익명 클래스 : 익명 클래스란 인스턴스화(instantiation)와 동시에 클래스를 정의하는 것이다. 특정 클래스가 여러 번 호출되지 않거나, 클래스 내부에 필드나 여러 개의 메소드를 정의할 필요가 있는 경우 익명 클래스로 정의하여 사용할 수 있다.
new Thread(() ->{
System.out.println("람다식");
}).start();
💡 변수 = 조건문 ? 반환값1 : 반환값2
물음표(?) 앞의 조건식에 따라 결과값이 참이면 반환값1을 반환하고, 결과값이 거짓이면 반환값2를 반환합니다.
// 두 수 중 더 큰 수를 출력
int num1 = 10;
int num2 = 5;
int result = num1 < num2 ? num2 : num1;
System.out.println(result); // 10
💡 연산자의 우선 순위는 수식 내에 연산자가 여러 개 있을 때, 연산자의 처리 순서를 결정한다.
➡️ 연산자는 왼쪽에서 오른쪽으로 수행되며, 연산자와 대입 연산자의 경우에는 오른쪽에서 왼쪽으로 수행된다.
| 우선순위 | 연산자 | 내용 |
|---|---|---|
| 1 | (), [] | 괄호 / 대괄호 |
| 2 | !, ~, ++, -- | 부정 / 증감 연산자 |
| 3 | *, /, % | 곱셈 / 나눗셈 연산자 |
| 4 | +, - | 덧셈 / 뺄셈 연산자 |
| 5 | <<, >>, >>> | 비트단위의 쉬프트 연산자 |
| 6 | <, <=, >, >= | 관계 연산자 |
| 7 | ==, != | 관계 연산자 |
| 8 | & | 비트 단위의 논리 연산자 |
| 9 | ^ | 비트 단위의 논리 연산자 |
| 10 | | | 비트 단위의 논리 연산자 |
| 11 | && | 논리곱 연산자 |
| 12 | || | 논리합 연산자 |
| 13 | ? | 조건 연산자 |
| 14 | =, +=, -=, *=, /=, %=, <<=, >>=,&=, ^=, ~= | 대입 / 할당 연산자 |