ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Switch Expression
    Study/Theory 2025. 5. 26.

    Java Switch Expression 완벽 가이드

    왜 만들어졌을까?

    기존 switch문은 여러 가지 문제점을 가지고 있었다.

     

    기존 Switch문의 문제점

    // 기존 방식의 문제점들
    String dayType;
    switch (day) {
        case MONDAY:
        case TUESDAY:
        case WEDNESDAY:
        case THURSDAY:
        case FRIDAY:
            dayType = "평일";
            break;  // break를 빼먹으면 fall-through 발생!
        case SATURDAY:
        case SUNDAY:
            dayType = "주말";
            break;
        default:
            dayType = "알 수 없음";
            break;
    }
    

     

    주요 문제점:

    1. Fall-through 버그: break문을 빼먹으면 의도치 않게 다음 케이스로 넘어감
    2. 보일러플레이트 코드: 매번 변수에 값을 할당하고 break를 써야 함
    3. 가독성 문제: 코드가 길어지고 본질적인 로직이 묻힘
    4. 타입 안전성 부족: 컴파일러가 모든 케이스 처리 여부를 완벽하게 검증하지 못함

     

    언제 도입되었을까?

    Switch Expression의 발전 과정:

    • Java 12 (2019년 3월): Preview 기능으로 처음 등장
    • Java 13 (2019년 9월): Preview 기능 개선, yield 키워드 도입
    • Java 14 (2020년 3월): 정식 기능으로 승격

     

    무엇이 바뀌었을까?

    1. 화살표 구문 (->) 도입

    // 기존 방식
    String result;
    switch (value) {
        case A: result = "에이"; break;
        case B: result = "비"; break;
    }
    
    // 새로운 방식
    String result = switch (value) {
        case A -> "에이";
        case B -> "비";
    };
    

     

    2. 표현식(Expression)으로 변화

    기존 switch문은 Statement이었지만, 이제 표현식(Expression)이 되어 값을 직접 반환할 수 있다.

    // 표현식이므로 직접 값을 반환
    int score = switch (grade) {
        case A -> 90;
        case B -> 80;
        case C -> 70;
        default -> 0;
    };
    
    // 메서드 호출에서도 바로 사용 가능
    processResult(switch (status) {
        case SUCCESS -> "성공 처리";
        case FAILED -> "실패 처리";
        default -> "알 수 없음";
    });
    

     

    3. Fall-through 방지

    화살표 구문을 사용하면 자동으로 break가 적용되어 fall-through가 불가능하다.

    // 안전함 - fall-through 불가능
    String result = switch (day) {
        case MONDAY -> "월요일";
        case TUESDAY -> "화요일";  // 자동으로 break 적용
        default -> "기타";
    };
    

     

    4. 복잡한 로직 처리 - yield 키워드

    복잡한 로직이 필요한 경우 중괄호와 yield 키워드를 사용. yield는 Switch Expression에서 값을 반환하는 키워드다.

    중괄호 블록 안에서 여러 줄의 코드를 작성한 후 최종 결과를 반환할 때 사용합니다.

    String result = switch (actionType) {
        case SIMPLE -> "단순 처리";
        case COMPLEX -> {
            // 복잡한 로직 처리
            System.out.println("복잡한 처리 시작");
            String processed = processComplexLogic();
            System.out.println("처리 완료");
            yield processed;  // yield로 값 반환 (return이 아님!)
        }
        default -> "기본 처리";
    };
    

    yield vs return 차이점:

    • return: 메서드에서 값을 반환하고 메서드 종료
    • yield: Switch Expression에서만 사용, 해당 case의 값을 반환

    5. 다중 케이스 처리 개선

    // 여러 케이스를 쉼표로 구분
    String dayType = switch (day) {
        case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "평일";
        case SATURDAY, SUNDAY -> "주말";
    };
    

     

    6. 모든 케이스 처리 강제

    컴파일러가 모든 가능한 케이스가 처리되었는지 더 엄격하게 검사합니다.

    // enum의 모든 값을 처리하지 않으면 컴파일 에러
    public String getSeasonType(Season season) {
        return switch (season) {
            case SPRING -> "봄";
            case SUMMER -> "여름";
            case FALL -> "가을";
            // WINTER를 빼먹으면 컴파일 에러!
        };
    }
    

     

    기존 방식과의 비교

    구분 기존 Switch문 Switch Expression

    문법 case: + break case ->
    Fall-through 실수 위험 있음 불가능 (안전)
    코드 길이 길고 반복적 간결함
    값 반환 별도 변수 필요 직접 반환
    다중 케이스 케이스별 반복 쉼표로 간단히
    컴파일러 검증 부분적 더 엄격함
    가독성 보통 우수함

     

    Switch Expression의 핵심 변화:

    • 화살표 구문 (->)으로 간결한 문법 제공
    • 표현식이 되어 값을 직접 반환 가능
    • Fall-through 방지로 더 안전한 코드 작성
    • yield 키워드로 복잡한 로직 처리 지원
    • 컴파일러 검증 강화로 모든 케이스 처리 보장

    'Study > Theory' 카테고리의 다른 글

    ResponseEntity 를 왜 쓰는 걸까?  (0) 2026.02.23
    [JAVA] Record :: 불변 데이터를 위한 간결한 문법  (0) 2025.05.24
    [DB] 트랜잭션, ACID  (0) 2024.09.20
    [DB] 인덱스 장단점  (1) 2024.09.16
    [운영체제] 캐시의 지역성  (1) 2024.09.10
Designed by Tistory.