기존 자바의 Switch 문은 break; 키워드를 빠뜨리면 예상치 못한 버그가 발생할 수 있다.
int score = 95;
String grade;
switch (score / 10) {
case 10:
case 9:
grade = "A";
// break;
// break 문을 빠뜨리면 예상치 못한 버그가 발생할 수 있다.
case 8:
grade = "B";
break;
default:
grade = "C";
}
System.out.println("학점: " + grade);
// 학점: B
자바 14버전 이후 부터는 Switch Expressions 구문을 사용해 간결하게 표현할 수 있다.
int score = 95;
String grade = switch (score / 10) { // 결과를 변수에 바로 할당
case 10, 9 -> "A"; // 쉼표로 여러 조건 묶기, -> 사용, break 불필요
case 8 -> "B";
default -> "C";
}; // 세미콜론(;) 필수!
System.out.println("학점: " + grade);
// 학점: A
if, else if 문이 중첩되면 가독성이 좋지않다.
void process(User user) {
if (user != null) {
if (user.isAuthorized()) {
if (user.hasData()) {
System.out.println("사용자 데이터 처리 중...");
} else {
System.out.println("데이터가 없습니다.");
}
} else {
System.out.println("권한이 없습니다.");
}
} else {
System.out.println("사용자가 존재하지 않습니다.");
}
}
가드 클로즈 패턴은 조건문의 guard 를 부정 조건(not guard)으로 치환하여 비정상적인 상황이면 함수를 빠르게 종료시키는 패턴이다.
void process(User user) {
if (user == null) {
System.out.println("사용자가 존재하지 않습니다.");
return; // 비정상 상황이면 빠르게 종료
}
if (!user.isAuthorized()) {
System.out.println("권한이 없습니다.");
return; // 비정상 상황이면 빠르게 종료
}
if (!user.hasData()) {
System.out.println("데이터가 없습니다.");
return; // 비정상 상황이면 빠르게 종료
}
System.out.println("사용자 데이터 처리 중...");
}
switch 문과 if-else if 구문은 컴파일러 레벨에서 다르게 동작한다.
if-else if 문은 조건을 위에서부터 하나씩 순차적으로 비교한다. 일치 조건이 조건문의 가장 하단에 존재한다면 모든 if 문의 조건을 평가한다. 하지만 switch 문은 컴파일러 레벨에서 ‘case 값이 촘촘하게 값이 모여있는 경우’ ‘점프 테이블’을 만들어 case 값들의 목차를 생성한다. switch 문에 변수가 할당되면 해당 테이블에서 조건 비교 없이 곧바로 일치하는 case 의 코드를 실행한다.
따라서, if-else if문은 case 가 많아질수록 함수가 점점 느려지지만, switch는 거의 일정한 속도를 유지할 수 있다.