목표
자바가 제공하는 다양한 연산자를 학습하세요.
학습할 것
| 산술 연산자 | 사칙 연산 ( + , - , / , * , %) |
| 비트 연산자 | 1 과 0 으로 참과 거짓의 결과 표현 |
| 관계 연산자 | 양쪽의 값이 어떤 관계를 갖는지 확인 |
| 논리 연산자 | 대상이 boolean 타입인 논리 값 |
| instanceof | (래퍼런스 타입 변수) instanceof (레퍼런스 데이터 타입) |
| assignment(=) operator | 값을 초기화 하여 할당 |
| 화살표 -> 연산자 | 람다 표현식 |
| 3항 연산자 | (조건) ? (조건이 참일 경우 실행) : (조건이 거짓일때 실행) |
| 연산자 우선순위 | (1) 괄호 (2) !, ~, ++, -- (3) *, /, % (4) +, - (5) <<, >>, >>> ... |
| switch 연산자 | if-else 과 같은 역할 / 13부터 value return 혹은 yield 추가 |

🌟 산술 연산자
: 덧셈, 뺄셈, 곱셈, 나눗셈 사칙 연산 ( +, -, *, /, % )
- boolean 을 제외한 모든 Primitive Type 에서 사용이 가능합니다.
** 산술 연산을 할 때는 타입에 따른 결과를 주의해야합니다.
타입 캐스팅 -> 원본 데이터의 데이터 타입 표현 범위를 모두 표현하지 못하는 데이터 타입으로 만들어진 변수에 값을 넣을 때
타입 프로모션 -> 원본 데이터의 데이터 타입 표현 범위를 모두 표현할 수 있는 데이터 타입으로 만들어진 변수에 값을 넣을 때
ex. 1.5 * 2.0 + (5.5 / 2) + 5 / 4 -> 6.75
🌟비트 연산자
: 1과 0 으로 이루어진 연산. / 0 = false & 1 = true
| ~ | 단항 연산자를 부정 (NOT) |
| & | 이항 연산자를 양쪽 항의 값이 모든 1인 경우 1 반환 (AND) |
| | | 이항 연산자로 양쪽 중 하나라도 1이면 1 반환 (OR) |
| ^ | 이항 연산자로 양쪽 한의 값이 서로 다를때 1 반환 (XOR, Exclusive or) |
| NOT (~) | |
| 입력 | 결과 |
| 1 | 0 |
| 0 | 1 |
| & (AND) | | (OR) | ^(XOR) | ||||||
| 입력1 | 입력2 | 결과 | 입력1 | 입력2 | 결과 | 입력1 | 입력2 | 결과 |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
Bitwise OR Operation of 5 and 7
0101
| 0111
________
0111 = 7 (In decimal)
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
Bitwise AND Operation of 5 and 7
0101
& 0111
________
0101 = 5 (In decimal)
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
Bitwise XOR Operation of 5 and 7
0101
^ 0111
________
0010 = 2 (In decimal)
🌟 관계 연산자
: 연산자를 중심으로 양쪽의 값이 어떤 관계를 가지는지 확인하는 연산자
- 종류 :

🌟 논리 연산자
: 비트 연산과 비슷하지만 대상(피연산자)이 boolean 타입의 논리 연산자인 경우이다.
- 종류 : ! , &&, ||
// flag = false 일때
while(!flag) {
.....
}
if(score < 90 && score >= 80) {
System.out.println("grade = B");
}
if (x < -1 || x > 5) {
System.out.println("범위는 -1보다 작거나 5보다 크다");
}
🌟 instanceof
: 객체 또는 배열 값을 어떠한 참조 유형에 맞는 값인지 평가하는 연산자; null 을 평가하면 항상 false
- (래퍼런스 타입변수) instanceof (레퍼런스 데이터 타입) - 래퍼런스 타입 변수가 래퍼런스 타입의 데이터 타입인지 확인하는 연산

public static void main(String[] args)
{
Child cobj = new Child();
// A simple case
if (cobj instanceof Child)
System.out.println("cobj is instance of Child");
else
System.out.println("cobj is NOT instance of Child");
}
// cobj is instance of Child
** 일반적으로 Java 프로그래머 사이에서 instanceof를 사용하지 않는 것이 좋습니다. 종종 의심스러운 설계의 신호일 수 있습니다. 정상적인 상황이라면 instanceof의 사용을 피할 수 있지만 필요한 경우도 있긴 합니다.
🌟 assignment(=) operator
: 대입 또는 할당 연산자; 오른쪽의 피연산자를 왼쪽의 피연산자의 값으로 할당한다.
- 왼쪽에는 변수가 오른쪽에는 리터럴 또는 리터럴이 담긴 변수 배치 (값을 초기화)
- 종류 : =, +=, -=, *=, /=, %=, &=, ^=, |=
<<=, >>=, >>>= -- ex. >>= : a = a >> b;와 같은 의미
🌟 시프트 (shift) 연산자
: 비트 이동 연산자
=> left_operand op n
| 연산자 | 사용법 | |
| << | op1 << op2 | op1 의 비트를 왼쪽으로 op2반큼 움직인다. |
| >> | op1 >> op2 | op1 의 비트를 오른쪽으로 op2 만큼 움직인다. |
| >>> | op1 >>> op2 | op1 의 비트를 오른쪽으로 2비트 시프트 |
- >> 의 경우에는 부족한 값을 오른쪽으로 이동할때 MSB 값으로 채우고
- >>> 의 경우에는 부족한 값을 무조건 0으로 채운다.
🌟 화살표(->) 연산자
: 람다 연산자 (Java 8) 아주 간단하고 유용하다.
>> 아래 예제들 모두 알고리즘 문제에 자주 나옴으로 기억해 두는 것이 좋습니다!!
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
};
// 람다로 변환
Comparator<Developer> byName =
(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
//sort by age
Collections.sort(listDevs, new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
🌟 3항 연산자
: 3개의 항을 가진 연산자. 물음표와 콜론을 사용하여 사용합니다.
-> (조건) ? (조건이 참일 경우 실행) : (조건이 거짓일때 실행)
int cnt = counts.compute(nums[i], (k,v) -> v == null ? 1 : v+1);
// 이것을 풀어서 쓸 경우는
if(counts.containsKey(nums[i])) {
counts.put(nums[i], counts.get(nums[i]) + 1);
} else {
counts.put(nums[i], 1);
}
🌟 연산자 우선 순위

우선순위를 외우는 것이 힘들다면
괄호를 이용하자 ... 😊
🌟 Java 13. switch 연산자
: 가독성을 포함해 실행 속도를 향상 시키기 위해 있는 문법
- java 13 에서는 switch 는 statement 가 아니고 operator (expression) 입니다
* 연산자란? 데이터를 처리하여 결과를 산출하기 위해 사용되는 표시나 기호
- 5개 이하의 케이스일 경우에는 if-else 이용해도 상관없지만 조건문이 많아질 경우에는 속도면에서는 switch가 더 빠른 결정이다.
그러므로 성능 향상을 중요하게 생각한다면 yes!
자세한 설명은 -> if vs. switch 작동법에 대한 정리 (parks38.tistory.com/14)
// Java 13, switch expression returns a value via yield
private static int getValueViaYield(String mode) {
int result = switch (mode) {
case "a", "b":
yield 1;
case "c":
yield 2;
case "d", "e", "f":
// do something here...
System.out.println("Supports multi line block!");
yield 3;
default:
yield -1;
};
return result;
}
// Traditional switch
private static int getValueBefore12(String mode) {
int result;
switch (mode) {
case "a":
case "b":
result = 1;
break;
case "c":
result = 2;
break;
case "d":
case "e":
case "f":
result = 3;
break;
default:
result = -1;
}
;
return result;
}'🌈 Java > Back to Basic 101' 카테고리의 다른 글
| 10주차 과제: 멀티쓰레드 프로그래밍 (0) | 2021.03.29 |
|---|---|
| 자바 기초 정리: Call by value & Call by reference (0) | 2021.03.03 |
| 자바 기초 정리: @Overloading vs. @Overriding (0) | 2021.03.03 |
| 자바 기초 정리: ArrayList vs. LinkedList (0) | 2021.03.03 |
| 자바 기초 정리: IF vs. Switch (0) | 2021.03.03 |