예를 들어, 학생 학점에 따라 다른 선물을 주려고 한다.
public enum Grades {
A, B, C, D
}
선물은 학점에 따라 5만원, 3만원, 1만원, 3천원을 가진다. 이 부분도 enum을 이용하겠지만 편의를 위해 String으로 구현했다.
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문을 이용하면 조금 더 깔끔하게 코드를 정리할 수 있다.
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문을 사용하지 않고도 폴스루를 방지할 수 있다.
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.