프로그래밍백엔드 개발자

자바에서 switch 표현식이란 무엇이며, 전통적인 switch와 어떤 차이점이 있으며 사용 시 어떤 주의사항이 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

문제의 역사:

자바 12 이전에는 switch 문이 오직 statement로만 사용되었습니다. 자바 12/14의 출시로 switch 표현식(switch expression)이 생겨났으며, 이는 구문과 operator의 기능을 확장했습니다. switch 표현식은 더 간결하고 표현력이 풍부한 코드를 위한 것입니다.

문제점:

전통적인 switch는 종종 오류를 발생시킵니다: break를 잊으면 fall-through가 발생하고, 여러 case가 있을 때 가독성이 떨어지며, 결과를 직접적으로 표현식에서 반환할 수 없고, 값의 전체적인 검사를 하지 못합니다.

해결책:

switch 표현식은 값을 반환할 수 있고, 화살표 구문을 사용하며, 컴파일 단계에서의 전체적인 분석을 지원하고 null을 default를 통해 처리할 수 있습니다. 구문은 다음과 같습니다:

String result = switch(day) { case MONDAY, FRIDAY -> "Workday"; case SATURDAY, SUNDAY -> "Weekend"; default -> throw new IllegalArgumentException(); };

주요 특징:

  • switch가 표현식으로 변경되었습니다: 결과를 변수에 할당할 수 있습니다.
  • 새로운 구문은 읽기 쉬워지고 잊은 break를 방지합니다.
  • 다수의 레이블 지원 (case A, B -> ...).

함정 질문.

switch가 enum, 문자열 및 null과 함께 작동할 수 있습니까?

enum과 함께 Java 5부터 작동합니다. 문자열과는 Java 7부터 가능합니다. null은 default를 통해서만 처리할 수 있으며, 그렇지 않으면 NPE가 발생합니다.

switch(day) { // day == null default: System.out.println("null"); } // 작동합니다

switch 표현식에서 enum의 모든 경우를 구현하지 않으면 어떻게 됩니까?

컴파일러는 모든 값에 대해 default 또는 implementation을 요구합니다. 이를 누락하면 컴파일 오류가 발생합니다.

새로운 유형의 switch 표현식에서 break를 사용할 수 있습니까?

화살표 방식에서는 break가 필요 없습니다. 블록을 사용할 경우 (case X -> { ... }) yield를 사용하여 값을 반환할 수 있습니다:

int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };

일반적인 오류 및 안티 패턴

  • null이 아닌 타입으로 작업할 때 default가 없으면 컴파일 오류가 발생합니다.
  • default 바깥에서 null을 처리하려고 하면 NullPointerException이 발생합니다.
  • 다수의 중첩을 가진 switch 사용은 다형성 대신 사용해야 합니다.

현실 예시

부정적인 사례

break가 없는 int와 함께 전통적인 switch:

switch(type) { case 1: actionA(); case 2: actionB(); // type==1과 type==2 모두에서 호출됩니다 }

장점:

  • 빠르게 작성할 수 있습니다.

단점:

  • 작은 실수가 심각한 버그로 이어질 수 있습니다.
  • 코드가 읽기 어렵고 유지보수가 힘듭니다.

긍정적인 사례

enum과 결과를 비교하기 위해 새로운 switch 표현식을 사용하는 예:

String status = switch(orderStatus) { case PAID -> "지불됨"; case CANCELED -> "취소됨"; default -> "처리 중"; };

장점:

  • 전체적인 분석으로 인해 오류가 줄어듭니다.
  • 코드가 간결하고 읽기 쉽습니다.

단점:

  • Java 14 이상 및 현대 구문에 대한 지식이 필요합니다.