[Java] 폴스루를 방지하는 switch 문

조민서·2023년 8월 26일
2

JAVA

목록 보기
16/17

예를 들어, 학생 학점에 따라 다른 선물을 주려고 한다.

public enum Grades {
	A, B, C, D
}

선물은 학점에 따라 5만원, 3만원, 1만원, 3천원을 가진다. 이 부분도 enum을 이용하겠지만 편의를 위해 String으로 구현했다.


if 문

public String calculate(Grade grade) {
    String gift = "";
    if (grade == Grade.A)  {
        gift = "5 만원";
    } else if (grade == Grade.B) {
        gift = "3 만원";
    } else if (grade == Grade.C) {
        gift = "1 만원";
    } else {
        gift = "3 천원";
    }
    return gift;
}

switch 문

switch문을 이용하면 조금 더 깔끔하게 코드를 정리할 수 있다.

public String calculate(Grade grade) {
    String gift = "";
    switch (grade) {
        case A:
            gift = "5 만원";
            break;
        case B:
            gift = "3 만원";
            break;
        case C:
            gift = "1 만원";
            break;
        case D:
            gift = "3천원";
            break;
    }
    return gift;
}

switch 문의 모든 조건 블록은 break문을 포함한다. break문은 swtich문의 다음 블록이 실행되는 것을 방지한다.
break를 실수로 빼먹으면 폴스루(fall-thorough) 모드로 실행된다.

자바 14 에서는 새로운 switch문을 이용해 여러 break문을 사용하지 않고도 폴스루를 방지할 수 있다.


폴스루를 방지하는 switch 문 (Java 14)

public String calculate(Grade grade) {
    var gift = switch (grade) {
        case A -> "5 만원";
        case B -> "3 만원";
        case C -> "1 만원";
        case D -> "3 천원";
    }
    return gift;
}

새로운 switch를 이용하면 가독성이 좋아질 뿐만 아니라 모든 가능성을 확인하는 소모 검사 (exhaustiveness) 도 해준다.

즉 enum에 switch를 사용하면 자바 컴파일러가 모든 enum 값을 switch에서 소모 했는지 확인한다.

예를 들어 학점 D를 처리하지 않으면 자바 컴파일러에 다음과 같은 오류가 발생한다.
error: the switch expression does not cover all possible input values.

profile
내 두뇌는 휘발성 메모리다. 😪

0개의 댓글