본문 바로가기
language/java

Switch Expression(Java 14)

by 죄니안죄니 2026. 6. 17.
반응형

이번 글은 Java 14에서 정식 도입된 Switch Expression이다.

많은 사람들이

"switch 문법이 조금 바뀌었네."

정도로 생각하지만,

실제로는 Java가 Statement(문) 중심에서 Expression(표현식) 중심으로 발전하기 시작한 대표적인 문법이다.

그리고 다음 글인 Pattern Matching for switch를 이해하기 위한 필수 선행 개념이기도 하다.


Switch Expression(Java 14)

switch를 값(Value)을 반환하는 표현식(Expression)으로 사용할 수 있게 만든 문법


기존 switch의 문제점

예를 들어

등급에 따라 할인율을 결정한다고 하자.

기존 방식은

 
String grade = "VIP";

int discount;

switch (grade) {

    case "VIP":
        discount = 30;
        break;

    case "GOLD":
        discount = 20;
        break;

    case "SILVER":
        discount = 10;
        break;

    default:
        discount = 0;
}
 

문제가 무엇일까?

discount 변수 미리 선언

↓

case마다 값 대입

↓

break 반드시 작성
 

이다.


break를 빼먹으면?

 
switch (grade) {

    case "VIP":
        discount = 30;

    case "GOLD":
        discount = 20;

    default:
        discount = 0;
}
 

실행 흐름

VIP

↓

30

↓

break 없음

↓

GOLD 실행

↓

20

↓

default 실행

↓

0
 

결과

 
discount == 0
 

이다.


이것을

Fall Through

라고 한다.

Java에서 가장 많이 발생하는 switch 버그 중 하나이다.


Switch Expression 등장

Java는

break를 없애고 값을 반환하는 switch를 만들자.

라는 방향으로 개선했다.


기존

 
int discount;

switch (grade) {

    case "VIP":
        discount = 30;
        break;

    case "GOLD":
        discount = 20;
        break;

    default:
        discount = 0;
}
 

Switch Expression

 
int discount = switch (grade) {

    case "VIP" -> 30;

    case "GOLD" -> 20;

    case "SILVER" -> 10;

    default -> 0;
};
 

한 줄로 끝난다.


왜 Expression이라고 부를까?

Statement(문)

 
if (condition) {

}
 

값을 반환하지 않는다.


Expression(표현식)

 
1 + 2

"user"

method()
 

항상 하나의 값을 만들어 낸다.


Switch Expression도

 
switch (...) {

}
 

의 결과가

30

20

10

0
 

중 하나의 값이 된다.


즉,

switch

↓

값 반환

↓

변수 대입 가능
 

이다.


여러 case를 동시에 처리

기존

 
switch (day) {

    case "SATURDAY":

    case "SUNDAY":

        type = "WEEKEND";

        break;

    default:

        type = "WEEKDAY";
}
 

Switch Expression

 
String type = switch (day) {

    case "SATURDAY", "SUNDAY"

            -> "WEEKEND";

    default

            -> "WEEKDAY";
};
 

가독성이 훨씬 좋아졌다.


여러 줄 로직은?

간단한 값은

 
case "VIP" -> 30;
 

로 끝난다.


하지만 여러 줄이라면?

 
int discount = switch (grade) {

    case "VIP" -> {

        System.out.println("VIP");

        yield 30;
    }

    default -> 0;
};
 

yield란?

많은 사람들이

return 비슷한 것인가?
 

라고 생각한다.

비슷하지만 범위가 다르다.


return

메서드 종료
 

yield

switch Expression 종료

↓

값 반환
 

이다.


예를 들어

 
public int getDiscount(String grade) {

    return switch (grade) {

        case "VIP" -> {

            System.out.println("VIP");

            yield 30;
        }

        default -> 0;
    };

}
 

실행 흐름

switch 시작

↓

VIP

↓

로그 출력

↓

yield 30

↓

switch 종료

↓

return 30
 

이다.


yield를 왜 만들었을까?

다음 코드를 보자.

 
case "VIP" -> {

    int result = 30;

    ...

    ...

    ...
}
 

블록 안에서

최종적으로 어떤 값을 반환할지
 

컴파일러가 알 수 없다.


그래서

 
yield result;
 

를 명시하도록 만든 것이다.


Fall Through가 사라졌다.

기존

 
case "VIP":

    ...

    break;
 

새로운 방식

 
case "VIP" -> 30;
 

실행 흐름

VIP

↓

30 반환

↓

switch 종료
 

자동으로 종료된다.


break를 잊을 일이 없다.


Enum과 함께 사용하면 더욱 좋다.

 
enum Grade {

    VIP,

    GOLD,

    SILVER

}
 

 
int discount = switch (grade) {

    case VIP -> 30;

    case GOLD -> 20;

    case SILVER -> 10;
};
 

컴파일러는

모든 Enum을 처리했는지 검사한다.


만약

 
enum Grade {

    VIP,

    GOLD,

    SILVER,

    BRONZE
}
 

가 추가되면


컴파일러는

BRONZE 처리 안 했습니다.
 

라고 알려준다.


실무에서는 매우 큰 장점이다.


실무 예제

HTTP Status

 
String message = switch (status) {

    case 200 -> "SUCCESS";

    case 404 -> "NOT FOUND";

    case 500 -> "SERVER ERROR";

    default -> "UNKNOWN";
};
 

사용자 권한

 
String role = switch (level) {

    case ADMIN -> "관리자";

    case USER -> "일반 사용자";

    case GUEST -> "손님";
};
 

기존 방식과 비교

기존

 
String role;

switch (...) {

    ...

    break;
}
 

Switch Expression

 
String role = switch (...) {

    ...

};
 

불필요한 변수 선언도 사라지고

break도 사라졌다.


언제 사용하는 것이 좋을까?

추천

  • Enum 처리
  • 상태 코드 변환
  • 문자열 변환
  • 간단한 분기 로직

추천하지 않는 경우

 
switch (...) {

    ...

    DB 저장

    ...

    파일 생성

    ...

    HTTP 호출

}
 

처럼

복잡한 비즈니스 로직은 여전히 일반 if/switch가 더 읽기 쉽다.


면접 포인트

Switch Expression이란?

Java 14부터 정식 지원된 기능으로, switch를 값을 반환하는 표현식(Expression)으로 사용할 수 있게 만든 문법이다.


기존 switch와 차이점은?

  • 값을 반환한다.
  • break가 필요 없다.
  • -> 문법을 사용한다.
  • Fall Through가 발생하지 않는다.

yield는 왜 필요한가?

여러 줄 블록에서 switch Expression이 반환할 값을 명시하기 위해 사용한다.


실무에서 가장 많이 사용하는 곳은?

  • Enum 분기
  • 상태 코드 변환
  • 문자열 매핑
  • 간단한 비즈니스 규칙

다음 글

다음은 Pattern Matching for switch(Java 21) 이다.

이 글에서는

 
switch (obj) {

    case String s -> ...

    case Integer i -> ...

    case User user -> ...

}
 

가 어떻게 가능한지,

instanceof + 형변환을 왜 더 이상 직접 작성하지 않아도 되는지,

그리고 record, sealed class와 어떻게 연결되는지까지 깊이 있게 설명하겠다.

반응형

'language > java' 카테고리의 다른 글

record(Java 16)  (0) 2026.06.17
Pattern Matching for switch(Java 21)  (0) 2026.06.17
Text Block(Java 15)  (0) 2026.06.17
var 키워드  (0) 2026.06.17
Reflection + Annotation + Proxy + ThreadLocal  (0) 2026.06.16

댓글