728x90
목표
- 자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선순위
- Java 13. switch 연산자
학습 내용 정리
연산자
- 연산자: 연산에 사용되는 기호
- 피연산자: 연산에 대한 대상
ex
// 연산자: +, 피연산자: 1, 2
1 + 2;
int a = 2;
int b = 3;
// 연산자: *, 피연산자: a, b
a * b;
산술 연산자
- Binary Operator(이항 연산자)
- +, -, *, /, %(Modulo)
- Arithmetic Exception(산술 예외) 발생 가능
INF "무한"또는 INF 값은 너무 큰 숫자를 나타냅니다. +INF 값은 너무 크고 양수 인 숫자를 나타냅니다. -INF 값은 너무 크고 음수 인 숫자를 나타냅니다. INF 값은 오버플로를 일으키는 부동 연산 또는 0으로 나누는 부동 소수점 연산에 의해 생성됩니다 NAN "무기한"/ "숫자가 아님"또는 NaN은 의미 없는 작업으로 인해 발생하는 값을 나타냅니다. NaN 값은 0을 0으로 나누거나 0을 나머지로 계산하여 생성됩니다
int a = 1 + 2;
int b = 4 - a;
int c = a * b;
// type casting 발생
double d = c / 2;
double e = c % 2;
// Divide by zero error
double DivideByZero = c / 0;
// Modulo by zero error
double ModuloByZero = c % 0;
비트 연산자
각각의 비트를 대상으로 연산을 진행하는 연산자이며 피연산자는 반드시 정수이어야 한다.
연산자 | 연산자의 기능 | 결합 방향 |
---|---|---|
& | 비트 단위로 AND 연산을 한다. | -> |
| | 비트 단위로 OR 연산을 한다 | -> |
^ | 비트 단위로 XOR 연산을 한다. | -> |
~ | 피연산자의 모든 비트를 반전시켜 얻은 결과를 반환한다. (단일항) | <- |
비트 시프트 연산자
피연산자의 비트 열을 왼쪽 또는 오른쪽으로 이동시킨 결과를 반환하는 함수이다.
연산자 | 연산자의 기능 |
---|---|
<< | 피연산자의 비트 열을 왼쪽으로 이동한다. 이동에 따른 빈 공간은 0으로 채운다. |
>> | 피연산자의 비트 열을 오른쪽으로 이동한다. 이동에 따른 빈 공간은 음수는 1, 양수는 0으로 채운다. |
>>> | 피연산자의 비트 열을 오른쪽으로 이동한다. 이동에 따른 빈 공간은 0으로 채운다. |
int a = 3 & 1; // 0011 & 0001 = 1 (0001)
int b = 2 | 1; // 0010 | 0001 = 3 (0011)
int c = 3 ^ 1; // 0011 ^ 0001 = 2 (0010)
int d = 2 >> 1; // 0010 에서 왼쪽으로 1칸 이동, 1 (0001)
int e = 2 << 1; // 0010 에서 오른쪽으로 1칸 이동, 4 (0100)
int f = ~1; // 0001 -> 1111 1111 1111 1111 1111 1111 1111 1110
관계 연산자
관계 연산자 | 설명 |
---|---|
== | 같으면 true. |
!= | 다르면 true. |
> | 왼쪽이 크면 true. |
>= | 왼쪽이 오른쪽보다 더 크거나 같으면 true. |
< | 오른쪽이 크면 true. |
<= | 오른쪽이 왼쪽보다 더 크거나 같으면 true. |
논리 연산자
- Binary Operator(이항)
&&
(LOGICAL AND)||
(LOGICAL OR)
- 피연산자의 타입은
boolean
- 연산 결과 타입은
boolean
&&
(LOGICAL AND)
피연산자1 | 피연산자2 | 연산 결과 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
||
(LOGICAL OR)
피연산자1 | 피연산자2 | 연산 결과 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
instanceof
객체가 특정 클래스 / 인터페이스 유형인지 여부를 확인 및 객체의 타입을 비교할 때 사용한다.
class A {}
class B extends A {}
public static void main(String[] args) {
A a = new A();
B b = new B();
System.out.println(a instanceof A); // true
System.out.println(b instanceof A); // true
System.out.println(a instanceof B); // false
System.out.println(b instanceof B); // true
}
assignment(=) operator
- Binary Operator(이항)
=
(ASSIGN)+=
(ADD and ASSIGN)-=
(SUBTRACT and ASSIGN)*=
(MULTIPLY and ASSIGN)/=
(DIVIDE and ASSIGN)%=
(MODULO and ASSIGN)&=
(AND and ASSIGN)^=
(XOR and ASSIGN)|=
(OR and ASSIGN)<<=
(LEFT SHIFT and ASSIGN)>>=
(RIGHT SHIFT and ASSIGN)>>>=
(UNSIGNED RIGHT SHIFT and ASSIGN)
i += 2; // i = i + 2 와 같음
// 비트 및 Shift 연산자와 결합해서 사용할 수 있음.
int a = 2; // 0010
// ~a : -3 (11111111111111111111111111111101)
a |= ~a; // 1 (11111111111111111111111111111111)
화살표(->) 연산자
Java 8 버전부터 람다 표현식(lambda expression) 이 공식적으로 적용되었다.
코드가 간결해진다는 장점이 있다.
(인자, ...) -> { /* 메소드 바디 */ }
화살표 왼쪽에 인자, 오른쪽에 실제 표현식을 쓴다.
a -> a + 1 // a lambda that adds one to its argument
a -> { return a + 1; } // an equivalent lambda using a block.
// 두 개의 숫자 더하기
public interface Compare {
public int compareTo(int a, int b);
}
public static void exec(Compare compare) {
int k = 10;
int m = 20;
int value = compare.compareTo(k, m);
System.out.println(value);
}
public static void main(String[] args) {
exec((i, j)->{ // compareTo(int a, int b) 부분, Compare 인터페이스를 구현
return i+j;
});
}
// 두 개의 숫자 중 큰 수 출력
public class Main{
@FunctionalInterface
public interface Compare {
int getMax(int n1, int n2);
}
public static void main(String[] args) {
Compare max = (x, y) -> {
if (x >= y) {
return x;
} else {
return y;
}
};
System.out.println(max.getMax(4, 10)); // 10
}
}
// Runnable 인스턴스 생성
Runnable runnable = ()->{
for(int i=0; i<30; i++) {
System.out.println(i);
}
};
Thread thread = new Thread(runnable);
thread.start();
// Thread 생성
Thread thread = new Thread(()->{
for(int i=0; i<30; i++) {
System.out.println(i);
}
});
thread.start();
3항 연산자
if-else 구문을 간결하게 만든 표현식
Conditional Expression ? Expression(true인 경우) : Expression(false 인 경우);
if-else와 3항 연산자 성능 면에서 크게 차이 나지 않는다.
2~3개의 값을 비교하기엔 3항 연산자가 가독성이 좋다. 3개를 넘어가면 가독성이 떨어진다.
연산자 우선순위
우선 순위 | 연산자 | 설명 | 연산 방향 |
---|---|---|---|
0 | (), [] | 괄호 / 대괄호 | |
1 | expr++ ㅤ expr-- | 후위 증가/감소 연산자 | 사후 증가 |
2 | ++expr ㅤ --expr ㅤ +expr ㅤ -expr ㅤ ~ ㅤ ! | 전위 증가/감소 연산자, 양/음 부호, 논리/비트 NOT 연산자 | <--- |
3 | * ㅤ / ㅤ % | 곱셈/나눗셈/나머지 연산자 | ---> |
4 | + ㅤ - | 덧셈/뺄셈 연산자 | ---> |
5 | << ㅤ >> ㅤ >>> | 비트 왼쪽/오른쪽 Shift 연산자, Unsigned Shift 연산자 | ---> |
6 | < ㅤ > ㅤ <= ㅤ >= ㅤ instanceof | 보다 작은/보다 큰/보다 작거나 같은/보다 크거나 같은 관계 연산자, instanceof | ---> |
7 | == ㅤ != | 와 같은/와 다른 관계 연산자 | ---> |
8 | & | 비트 AND 연산자 | ---> |
9 | ^ | 비트 XOR 연산자 | ---> |
10 | | | 비트 OR 연산자 | ---> |
11 | && | 논리 AND 연산자 | ---> |
12 | || | 논리 OR 연산자 | ---> |
13 | ? : | 삼항 조건 연산자 | ---> |
14 | = ㅤ += ㅤ -= ㅤ *= ㅤ /= ㅤ %= ㅤ &= ㅤ ^= ㅤ |= ㅤ <<= ㅤ >>= ㅤ >>>= | 대입 연산자 및 복합 대입 연산자 | <--- |
728x90
'Java' 카테고리의 다른 글
[Java] JUnit5 (0) | 2023.04.26 |
---|---|
[Java] 제어문 (0) | 2023.04.24 |
[Java] Primitive Type Array to Stream (0) | 2023.04.19 |
[Java] String / StringBuffer / StringBuilder 차이점 & 성능 비교 (0) | 2023.04.18 |
[Java] 데이터 타입, 변수 그리고 배열 (0) | 2023.04.12 |
댓글