산술 연산자
비트 연산자
관계 연산자
논리 연산자
instanceof
assignment(=) operator
화살표(->) 연산자
3항 연산자
연산자 우선 순위
(optional) Java 13. switch 연산자
| 연산자 | 연산자의 기능 |
|---|---|
| = | 연산자 오른쪽에 있는 값을 연사자 왼쪽에 있는 변수에 대입한다. 예) val = 20; |
| + | 두 피연산자의 값을 더한다. 예) val 4 + 3; |
| - | 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다. 예) val = 4 - 3; |
| * | 두 피연산자 값을 곱한다. 예) val = 4 * 3; |
| / | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다. 예) val = 7 / 3; |
| % | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. 예) val = 7 % 3; |
| 연산자 | 기호 | 설명 |
|---|---|---|
| 비트 NOT 연산자 | ~ | 2진수의 각 자릿수에 대해서 NOT 연산을 한다. 피연산자가 하나이기 때문에 단항 연산자처럼 사용하면 된다. |
| 비트 AND 연산자 | & | 2진법으로 표시된 두 개의 피연산자가 필요하고 2진법 각 자릿수에 대해서 AND 연산을 실시한다. |
| 비트 OR 연산자 | | | 2진법으로 표시된 두 개의 피연산자가 필요하며 2진법 각 자릿수에 대해서 OR 연산을 실시한다. |
| 비트 XOR 연산자 | ^ | 2진법으로 표시된 두 개의 피연산자가 필요하며 2진법 각 자릿수에 대해서 XOR 연산을 실시한다. XOR 연산은 피연산자의 두 값이 서로 다를 때만 true를 반환한다. |
👉 예시 )
int i = 10;
System.out.println("Variavle i (Decimal) : " + i);
System.out.println("Variavle i (Binary) : " + Integer.toBinaryString(i)); // 2진수로 표시
i = ~i; // 비트 NOT 연산자
System.out.println("Variavle i (Decimal) : " + i);
System.out.println("Variavle i (Binary) : " + Integer.toBinaryString(i)); // 2진수로 표시
// 변수 i의 초기값은 10 이며, 10의 2진수로 표기하면 1010 이다.
// int 변수형의 메모리 크기는 32bit 이므로 32개의 각 자릿수에서 NOT 연산이 진행됨.
실행결과 :
Variavle i (Decimal) : 10
Variavle i (Binary) : 1010
Variavle i (Decimal) : -11
Variavle i (Binary) : 11111111111111111111111111110101
위의 예시와 같은 과정을 거치면 ~(NOT) 연산의 결과는 10진수로 -11이 된다.
만약 NOT 연산자를 사용하여 비트의 보수가 아닌 정수의 보수를 구하고 싶다면 ~i + 1 과 같이
'+1' 연산까지 거쳐야 한다.
👉 추가 예시 )
👉 비트 AND, OR, XOR 연산자의 진리표
👉 예시 )
int b1 = 0B0010;
int b2 = 0B0101;
int b3 = 0b1111;
int rtAndOp = b1 & b3; // 비트 AND 연산자
int rtOrOp = b1 | b2; // 비트 OR 연산자
int rtXorOp = b1 ^ b3; // 비트 XOR 연산자
System.out.println("b1 AND b3 : " + Integer.toBinaryString(rtAndOp));
System.out.println("b1 OR b2 : " + Integer.toBinaryString(rtOrOp));
System.out.println("b1 XOR b3 : " + Integer.toBinaryString(rtXorOp));
실행결과 :
b1 AND b3 : 10
b1 OR b2 : 111
b1 XOR b3 : 1101
👉 추가 예시 )
int a = 5;
int b = 7;
boolean result = a == b; // 결과: false
int x = 10;
int y = 10;
boolean result = x != y; // 결과: false
double num1 = 8.5;
double num2 = 6.3;
boolean result = num1 > num2; // 결과: true
float value1 = 4.2f;
float value2 = 5.1f;
boolean result = value1 < value2; // 결과: true
| 변수명 a | !a 연산 결과 |
|---|---|
| true | false |
| false | true |
boolean isSunny = false;
if( !isSunny ) {
System.out.println("Bad Weather!");
} else {
System.out.println("Good Weather!");
}
// Bad Weather 출력
| 변수명 a | 변수명 b | a && b 연산 결과 |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
int age = 25;
boolean hasLicense = true;
if( age >= 18 && hasLicense ) {
System.out.println("운전 가능");
} else {
System.out.println("운전 불가능");
}
// 운전 가능 출력
| 변수명 a | 변수명 b | a || b 연산 결과 |
|---|---|---|
| true | true | true |
| true | false | true |
| false | true | true |
| false | false | false |
boolean isWeekend = true;
boolean hasFreeTime = false;
if( isWeekend || hasFreeTime ) {
System.out.println("Free Day!");
} else {
System.out.println("Busy Day!");
}
// Free Day! 출력
object instanceof Type
object 는 검사하려는 객체를 나타내고, Type은 클래스나 인터페이스의 타입을 나타낸다.
결과 값은 boolean 형태로 반환되며, 객체가 해당 타입의 인스턴스인 경우 true를 반환,
그렇지 않은 경우 false를 반환
Object obj = "Hello, Java!";
if(obj instanceof String)
System.out.println("obj is an instance of String");
else
System.out.println("obj is not an instance of String");
// obj is an instance of String 출력
int x = 5; // x에 5를 할당
int y = 10;
y += 3; // y = y + 3; 과 동일
int z = 15;
z -= 5; // z = z - 5; 과 동일
int a = 8;
a *= 2; // a = a * 2; 과 동일
int b = 20;
b /= 4; // b = b / 4; 과 동일
int c = 17;
c %= 5; // c = c % 5; 과 동일
int d = 8;
d <<= 2; // d = d << 2; 과 동일
int e = 16;
e >>= 3; // e = e >> 3; 과 동일
int f = 12;
f &= 3; // f = f & 3; 과 동일
int g = 9;
g |= 6; // g = g | 6; 과 동일
int h = 10;
h ^= 3; // h = h ^ 3; 과 동일
int i = -15;
i >>>= 2; // i = i >>> 2; 과 동일
👉 시프트 연산의 과정
👉 예시 )
int x = -5;
int y = 6;
int rt1 = x << 4; // -5에 대한 left 시프트 연산
int rt2 = x >> 2; // -5에 대한 right 시프트 연산
int rt3 = y << 3; // 6에 대한 left 시프트 연산
int rt4 = y >> 1; // 6에 대한 right 시프트 연산
int rt5 = y >>> 3; // 6에 대한 unsigned right 시프트 연산
System.out.println("Binary x : " + Integer.toBinaryString(x));
System.out.println("Binary y : " + Integer.toBinaryString(y));
System.out.println("left : " + rt1 +", " + Integer.toBinaryString(rt1));
System.out.println("right : " + rt2 +", " + Integer.toBinaryString(rt2));
System.out.println("left : " + rt3 +", " + Integer.toBinaryString(rt3));
System.out.println("right : " + rt4 +", " + Integer.toBinaryString(rt4));
System.out.println("unsigned right : " + rt5 +", " + Integer.toBinaryString(rt5));
실행결과 :
Binary x : 11111111111111111111111111111011
Binary y : 110
left : -80, 11111111111111111111111110110000
right : -2, 11111111111111111111111111111110
left : 48, 110000
right : 3, 11
unsigned right : 0, 0
👉 예시 )
// 인터페이스 정의
interface MyFunction {
int apply(int x);
}
public class Main {
public static void main(String[] args) {
MyFunction mf1 = new MyFunction() {
@Override
public int apply(int x) {
return x + 1;
}
};
// 람다 표현식으로 작성한 함수
MyFunction mf2 = x -> x * 2;
// 함수 사용
System.out.println("value : " + mf1.apply(5)); // 출력: 6
System.out.println("value : " + mf2.apply(3)); // 출력: 6
}
}
실행결과 :
value : 6
value : 6
x -> x * 2 와 같은 람다 표현식에서 x는 매개변수를 나타내며,
->는 매개변수와 표현식 바디를 연결하는 역할을 한다.
👉 시프트 연산의 과정
3항 연산자는 두 개의 연산자인 물음표(?)와 콜론(:) 그리고 3개의 피연산자로 구성
피연산자1의 결과값이 true 이면 피연산자2의 값이 반환되며, 피연산자1의 값이 false 이면
피연산자3의 값이 반환된다.
boolean isRound = false;
boolean ex1 = (isRound) ? true : false;
boolean isEnable = true;
int ex2 = (isEnable) ? 1 : 2;
int a = 3;
boolean ex3 = (a > 4) ? false : true;
int b = 3;
int ex4 = (b > 0) ? (b % 2) : 0;
System.out.println("ex1 : " + ex1);
System.out.println("ex2 : " + ex2);
System.out.println("ex3 : " + ex3);
System.out.println("ex4 : " + ex4);
실행결과 :
ex1 : false
ex2 : 1
ex3 : true
ex4 : 1
| 우선순위 | 연산자 | 설명 |
|---|---|---|
| 1 | ( ) (괄호) | 가장 높은 우선순위를 가지며, 괄호 안의 연산이 먼저 수행됩니다. |
| 2 | [ ] (대괄호) | 배열 인덱스 접근 연산자. |
| 3 | . (점) | 멤버(필드 또는 메서드) 접근 연산자. |
| 4 | ++, -- (증감 연산자) | 전위 증감 및 후위 증감 연산자. |
| 5 | +, - (부호 연산자) | 양수/음수 부호 표시. |
| 6 | ! (논리 NOT) | 논리 NOT 연산자. |
| 7 | ~ (비트 NOT) | 비트 NOT 연산자. |
| 8 | *, /, % (곱셈, 나눗셈, 나머지) | 산술 연산자. |
| 9 | +, - (덧셈, 뺄셈) | 산술 연산자. |
| 10 | <<, >>, >>> (비트 시프트) | 비트 시프트 연산자. |
| 11 | <, <=, >, >= (비교 연산자) | 비교 연산자. |
| 12 | ==, != (등호 연산자) | 동등성 비교 연산자. |
| 13 | & (비트 AND) | 비트 AND 연산자. |
| 14 | ^ (비트 XOR) | 비트 XOR 연산자. |
| 15 | | (비트 OR) | 비트 OR 연산자. |
| 16 | && (논리 AND) | 논리 AND 연산자. |
| 17 | || (논리 OR) | 논리 OR 연산자. |
| 18 | ? : (삼항 연산자) | 조건식 연산자. |
| 19 | = (대입 연산자) | 변수에 값 할당. |
| 20 | +=, -=, *=, /=, %= 등 (복합 대입 연산자) | 산술 연산과 대입을 동시에 수행하는 연산자. |
| 21 | instanceof (타입 검사) | 객체의 타입 검사 연산자. |
👉 switch 표현식의 기본 구문
result = switch (표현식) {
case 값1 -> 표현식1;
case 값2 -> 표현식2;
// ...
default -> 표현식N;
};
👉 기존 switch문 활용 예)
int number = 5;
switch (number) {
case 1:
System.out.println("1입니다.");
break;
case 2:
System.out.println("2입니다.");
break;
default:
System.out.println("1 또는 2가 아닙니다.");
break;
}
👉 java 13 switch 연산자 활용 예)
int number = 5;
int result = switch (number) {
case 1 -> {
System.out.println("1입니다.");
yield 1;
}
case 2 -> {
System.out.println("2입니다.");
yield 2;
}
default -> {
System.out.println("1 또는 2가 아닙니다.");
yield -1;
}
};
System.out.println(result);