Link Search Menu Expand Document

Page last modified: Mar 26 2021

목표

자바가 제공하는 다양한 연산자 학습하기

Table of contents

연산자 (Operator)

연산을 위한 기호, 심볼

  • 이항 연산자 (Binary Operator)  두 개의 operands가 있어야 하는 연산자
  • 단항 연산자 (Unary Operator)  한 개의 operand에 대해 연산을 수행

산술 연산자 (Arithmetic Operators)

  • 연산 가능 데이터 타입: char, byte, short, int, long, float, double
  • char, byte, short형 연산 시 JVM Specification에 따라 int형으로 프로모션되기 때문에
    타입 캐스팅을 해주거나 결과를 저장하는 변수의 타입을 int로 설정해야 함
  • 정수형 간 나누기의 경우 계산 결과가 실수값이더라도, 두 operands는 정수형이기 때문에 결과는 정수값이다
  • 두 operands의 타입이 다를 경우, 범위가 큰 타입을 따라 나머지 하나가 타입 프로모션된다

종류

  • Addition(+) String 연결 연산자로도 쓰임
System.out.println("Total: " + 3 + 4); // Total: 34
  • Subtraction(-)
  • Multiplication(*)
  • Division (/) 0 또는 0.0으로 나눌 경우
System.out.println(0/0);  // java.lang.ArithmeticException: / by zero
System.out.println(1/0);  // java.lang.ArithmeticException: / by zero

System.out.println(0.0/0);    // NaN
System.out.println(1.0/0);    // Infinity
System.out.println(-1.0/0.0); // -Infinity
  • Modulo(%)

비트 연산자 (Bitwise Operators)

  • 비트 간 연산을 수행
  • 연산 가능 데이터 타입: 0과 1로 표현 가능한 정수형
연산자논리
&AND, 두 비트가 모두 1일 경우 1
|OR, 두 비트 중 하나가 1일 경우 1
^XOR, 한 비트가 1이고 나머지 한 비트가 0 경우 1
~NOT, 비트 보수 (0 ⇔ 1)
  0101          0101          0101      
& 1001        | 1001        ^ 1001        ~ 0101
------        ------        ------        ------
  0001          1101          1100          1010

비트 이동 연산자 (Shift Operators)

<number> <operator> <num of shift>
  ⇒ <number>를 2진수(int는 32-bit, long은 64-bit)로 바꾼 후 shift

연산자연산식동작
<<num << nLeft shift
n개 만큼 비트를 왼쪽으로 밀기
오른쪽 비트는 0으로 채움
⇒ 부호 유지, num * 2^n과 결과 동일
>>num >> nSigned right shift
n개 만큼 비트를 오른쪽으로 밀기
왼쪽 비트는 부호 비트로 채움
⇒ 부호 유지, num이 양수면 num / 2^n과 결과 동일
>>>num >>> nUnsigned right shift
shift 수 만큼 비트를 오른쪽으로 밀기
왼쪽 비트는 0으로 채움
⇒ 음수의 경우 부호 바뀜, num이 양수면 num / 2^n과 결과 동일

💡 음수의 2진수 표현에는 2의 보수법이 사용된다

10 << 2   // 00000000 00000000 00000000 00001010 << 2 = 00000000 00000000 00000000 00101000 = 40 = 10 * 2^2
-1 << 2   // 11111111 11111111 11111111 11111111 << 2 = 11111111 11111111 11111111 11111100 = -4 = -1 * 2^2

10 >> 2   // 00000000 00000000 00000000 00001010 >> 2 = 00000000 00000000 00000000 00000010 = 2 = 10/4
-1 >> 2   // 11111111 11111111 11111111 11111111 >> 2 = 11111111 11111111 11111111 11111111 = -1

10 >>> 2  // 00000000 00000000 00000000 00001010 >>> 2 = 00000000 00000000 00000000 00000010 = 2 = 10/4
-1 >>> 2  // 11111111 11111111 11111111 11111111 >>> 2 = 00111111 11111111 11111111 11111111 = 1073741823

참고 링크
https://coding-factory.tistory.com/521
https://www.geeksforgeeks.org/bitwise-operators-in-java/


관계 연산자, 비교 연산자 (Comparison Operators)

두 operands를 비교하여 true 또는 false를 반환

  • <  >  <=  >=  primitive type 사용 (boolean 제외)
  • ==  !=  값을 비교하거나 두 operands가 reference type일 경우 객체의 주소값을 비교
    ⭐️ String type은 A.equals(B) 로 비교

논리 연산자 (Logical Operators)

두 항을 비교하여 true 또는 false를 반환

연산자연산식동작
&&x < 1 && y > 3두 항이 모두 참인 경우 true
앞 항이 거짓이면 뒷 항은 체크X ⇒ 단락 회로 평가(Short Circuit Evaluation)
||x < 1 || y > 3두 항 중 하나가 참인 경우 true
앞항이 참이면 뒷 항은 체크X ⇒ 단락 회로 평가(Short Circuit Evaluation)
!!(x < 1)참인 경우 false, 거짓인 경우 true

instanceof 연산자


대입 연산자 (Assignment Operator)

  • =  +=  -=  *=  /=  %=

새로 알게 된 것 ↓

연산자연산식풀어 쓴 식
&=x &= 3x = x & 3
|=x |= 3x = x | 3
^=x ^= 3x = x ^ 3
>>=x >>= 3x = x >> 3
<<=x <<= 3x = x <<3

출처 https://www.w3schools.com/java/java_operators.asp


화살표 연산자 -> (Lambda Arrow Operator)

람다식에 쓰이는 연산자

람다식(Lambda Expression)
익명 클래스처럼 이름(식별자, identifier)이 없는 메소드

// Syntax  (parameter) -> { method body }

(a, b) -> { return (a >= b) ? a : b; }

event -> System.out.println("Welcome!")

3항 연산자 (Ternary Operator)

Syntax  <if statement> ? <true case> : <false case>
  ⇒ 조건문의 결과에 따라 <true case> 또는 <false case> 를 반환

  • 간단한 if-else 구문의 경우 3항 연산자를 사용하여 간결하게 표현할 수 있다
  • 중첩 사용도 가능하지만 가독성을 위해 지양하는 것이 좋다
int max = (a >= b) ? a : b;

public int getMax(int a, int b) {
    return (a >= b) ? a : b;
}

연산자 우선 순위

우선순위연산자
0괄호로 묶인 연산 ()
1postfix ++ --
2infix ++ --
부호 + -
단항 연산자 ~ !
3산술 연산자 * / %
4산술 연산자 + -
5비트 이동 연산자 << >> >>>
6비교 연산자 < > <= >=
타입 비교 연산자 instanceof
7비교 연산자 == !=
8비트 연산자 &
9비트 연산자 ^
10비트 연산자 |
11논리 연산자 &&
12논리 연산자 ||
133항 연산자 ?
14대입 연산자 = += -= *= /= %= &= ^= |= <<= >>= >>>=

참고 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html


Java 13. switch 연산자 (Switch Expression)

  1. 화살표 연산자-> 사용: 다음 case로 진행하지 않도록 하는 break문이 필요 없어짐
  2. switch expression의 값 명시를 위한 break문을 yield 키워드로 변경하여 사용

참고 https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }

Day day = Day.WEDNESDAY;

// e.g. for 1
System.out.println(
    switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        case THURSDAY, SATURDAY     -> 8;
        case WEDNESDAY              -> 9;
        default -> throw new IllegalStateException("Invalid day: " + day);
        }
    );

// e.g. for 2
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> {
        System.out.println(6);
        yield 6;
    }
    case TUESDAY -> {
        System.out.println(7);
        yield 7;
    }
    case THURSDAY, SATURDAY -> {
        System.out.println(8);
        yield 8;
    }
    case WEDNESDAY -> {
        System.out.println(9);
        yield 9;
    }
    default -> {
        throw new IllegalStateException("Invalid day: " + day);
    }
};