일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- N+1
- B+TREE
- 우테코
- 월간회고
- 클래스
- SQL 실행순서
- useMutation
- BalancedTree
- 주간회고
- 메서드명
- Blue-Green
- mysql
- 블로그 병행
- 카카오 2차 코딩테스트
- Jenkins
- InnoDB 버퍼 풀
- 도커
- 어댑티브 해시 인덱스
- db
- 계층별 구조
- DeleteAll
- 기능별 구조
- 멀티쓰레드 프로그래밍
- ci/cd
- jacoco
- 백기선 스터디
- useQuery
- 회고
- 프리코스
- java
- Today
- Total
Haneul's Blog
[Java] 연산자 본문
백기선님 자바 스터디의 3주차 주제인 연산자에 대해서 자세하게 정리해보려고 합니다.
오늘은 부연 설명하지 않고 바로 시작하겠습니다.
목표 [백기선님 3주차 자바 스터디]
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
산술 연산자
수학적인 계산에 사용되는 연산자로 모두 두 개의 피 연산자를 가지는 이항 연산자 입니다.

위의 그림과 같이 총 5개의 산술 연산자가 있고, (*, /, %)가 (+, -)보다 우선순위를 갖습니다.
(/, %)를 사용하는 경우에는 나누는 수로 0을 사용하면 에러가 발생하기 때문에 잘 유의해서 사용해야 합니다.
비트 연산자
비트 연산자는 비트 단위로 논리 연산을 할 경우에 사용하는 연산자입니다.
~ | 비트의 반전(Ex:0을 1로, 1을 0으로) |
& | 비트 단위 AND(Ex:1&1=1, 1&0=0, 0&0=0) |
| | 비트 단위 OR(Ex:0|0=0, 0|1=1, 1|0=1, 1|1=1) |
^ | 비트 단위 XOR(Ex:1^0=1,0^1=1,0^0=0, 1^1=0) |
<< | 왼쪽 쉬프트(Ex:a<<1, a를 1비트만큼 왼쪽으로 이동) |
>> | 오른쪽 쉬프트(Ex:a>>1, a를 1비트만큼 오른쪽으로 이동 |
~(비트 전환 연산자)
피연산자를 2진수로 표현했을 때, 0은 1로 1은 0으로 바꿔줍니다.
<<, >>(쉬프트 연산자)
피연산자의 각 자리를 <<(왼쪽), >>(오른쪽)으로 이동한다고 해서 쉬프트 연산자라고 합니다.
int a = 10; // 1010
// 1만큼 왼쪽 쉬프트한 결과는?
int b = a << 1; // 2진수로는 10100이 되기 때문에, 10진수로는 20(16+4)이 됩니다.
// 다시 오른쪽으로 1만큼 쉬프트 한 결과는?
int c = b >> 1; // 2진수로는 1010이 되기 떄문에, 10진수로는 10(8+2)이 됩니다.
// 그 전에 a값과 다시 동일해지는 것을 알 수 있습니다.
|, &, ^(OR, AND, XOR 연산자)
| ( OR연산자 ) | 피연산자 중 한 쪽값이 1이면, 1을 반환한다. 그 외에는 0 반환. |
& ( AND연산자 ) | 피연산자 중 양쪽이 모두 1이어야만 1을 반환한다. 그 외에는 0 반환. |
^ ( XOR연산자 ) | 피연산자의 값이 값이 서로 다를 때만 1을 반환한다. 같을 때는 0 반환. |
관계 연산자
피연산자 사이의 상대적인 크기를 판단하는 연산자로 왼쪽과 오른쪽의 크기를 비교해주는 연산자입니다.
== | 왼쪽의 피연산자와 오른쪽의 피연산자가 같으면 참 |
!= | 왼쪽의 피연산자와 오른쪽의 피연산자가 같지 않으면 참 |
> | 왼쪽의 피연산자와 오른쪽의 피연산자가 크면 참 |
>= | 왼쪽의 피연산자와 오른쪽의 피연산자가 크거나 같으면 참 |
< | 왼쪽의 피연산자와 오른쪽의 피연산자가 작으면 참 |
<= | 왼쪽의 피연산자와 오른쪽의 피연산자가 작거나 같으면 참 |
논리 연산자
주어진 논리식을 판단하여 참과 거짓을 결정해주는 연산자입니다.
&& | 논리식이 모두 참이면 참반환 |
|| | 논리식 중에 하나라도 참이면 참반환 |
! | 논리식의 결과가 참이면 거짓, 거짓이면 참을 반환 |
instanceof
객체의 타입을 확인하는데 사용하는 연산자입니다.
사용 방법은 아래 예제를 참고하면 좋을 것 같습니다.
class Haneul extends Man {}
class Man {}
public class Test {
public static void main(String[] args) {
Haneul haneul = new Haneul();
Man man = new Man();
System.out.println(haneul instanceof Haneul); // true
System.out.println(haneul instanceof Man); // true
System.out.println(man instanceof Man); //true
System.out.println(man instanceof Haneul); // false
}
}
assignment(=) operator
쉽게 말하면 대입을 해주는 연산자로 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용합니다.
= | 왼쪽 피연산자에 오른쪽의 피연산자를 대입 |
+= | 왼쪽 피연산자에 오른쪽의 피연산자를 더한 후 대입 |
-= | 왼쪽 피연산자에 오른쪽의 피연산자를 뺀 후 대입 |
*= | 왼쪽 피연산자에 오른쪽의 피연산자를 곱한 후 대입 |
/= | 왼쪽 피연산자에 오른쪽의 피연산자를 나눈 후 대입 |
%= | 왼쪽 피연산자에 오른쪽의 피연산자를 나머지를 대입 |
&= | 왼쪽 피연산자를 오른쪽의 피연산자를 비트 AND 연산한 후 대입 |
|= | 왼쪽 피연산자를 오른쪽의 피연산자를 비트 OR 연산한 후 대입 |
^= | 왼쪽 피연산자를 오른쪽의 피연산자를 비트 XOR 연산한 후 대입 |
<<= | 왼쪽 피연산자를 오른쪽의 피연산자만큼 왼쪽 시프트한 후 대입 |
>>= | 왼쪽 피연산자를 오른쪽의 피연산자만큼 부호를 유지하고 오른쪽 시프트한 후 대입 |
>>>= | 왼쪽 피연산자를 오른쪽의 피연산자만큼 부호에 상관없이 오른쪽 시프트한 후 대입 |
화살표(->) 연산자
Java8에서 추가된 것으로 화살표(->) 기호를 사용하여 람다표현식을 작성할 수 있습니다.
여기서 람다 표현식이란 메서드를 하나의 식으로 표현한 것을 의미합니다.
// 일반 메서드
int sum(int x, int y){
return x + y;
}
// 람다식
(x, y) -> x + y;
// 둘의 결과는 같습니다.
이러한 람다 표현식을 사용할 경우에 유의할 점이 있습니다.
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
- 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다.
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
- return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 됩니다.
3항 연산자

3항 연산자는 위의 그림과 같은 방법을 사용하여 간단한 조건식을 사용하여 값을 대입하고 싶을 경우에 사용하는 연산자를 의미합니다.
코드를 간결하고 직관적으로 나타낼 수 있다는 장점이 있습니다.
int x = 3;
int y = 4;
int result = x > y ? x : y; // result의 값은 4가 됩니다.
연산자 우선 순위
연산자 우선순위는 아래의 표를 참고하면 좋을 것 같습니다.

Java 13. switch 연산자
기존에 switch 연산자가 있었는데 Java13에서 switch 연산자를 약간 변경한 것 같습니다.
항상 무엇인가를 변경할 때 문제가 있으니까 변경을 한다고 생각을 해서 찾아보니 기존의 불필요한 장황함, 디버깅이 어렵다는 문제 때문에 조금 더 업그레이드 했다고 합니다.
switch문에 람다식을 사용할 수 있게 되어서 조금 더 간결하고 직관적으로 변경되었고, break가 아닌 yield를 사용하여 산출값이 리턴 가능하게 되었습니다.
기존 switch
private static int getValueViaBreak(String mode) {
int result = switch (mode) {
case "a":
case "b":
break 1;
case "c":
break 2;
case "d":
case "e":
case "f":
break 3;
default:
break -1;
};
return result;
}
Java13의 switch
private static int getValueViaArrow(String mode) {
int result = switch (mode) {
case "a", "b" -> 1;
case "c" -> 2;
case "d", "e", "f" -> {
// do something here...
System.out.println("Supports multi line block!");
yield 3;
}
default -> -1;
};
return result;
}
'Java' 카테고리의 다른 글
[Java] 상속 (0) | 2022.10.17 |
---|---|
[Java] 클래스 (0) | 2022.10.16 |
[Java] 제어문 (0) | 2022.10.15 |
[Java] 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.10.12 |
[Java] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.10.11 |