if-else 사용 시
// 분기 대상인 'role' 변수가 매번 반복된다
if (role == UserRole.ADMIN) {
// 관리자 로직
} else if (role == UserRole.MEMBER) {
// 회원 로직
} else if (role == UserRole.GUEST) {
// 손님 로직
}
향상된 switch 사용 시
// 분기 대상 'role'은 처음에 한 번만 명시된다
// 각 case에서는 값만 비교하면 되므로 의도가 명확하다
String result = switch (role) {
case ADMIN -> "관리자 로직 처리";
case MEMBER -> "회원 로직 처리";
case GUEST -> "손님 로직 처리";
};
UserRole에 새로운 등급인 MANAGER가 추가되었다고 가정한다
if-else의 경우MANAGER 등급의 사용자가 들어왔을때, 모든 조건을 통과하여 아무 로직도 실행되지 않는 런타임 버그가 발생한다.switch의 경우error: the switch expression does not cover all possible input values핵심 원리 : Jump Table
컴파일러는 개발자가 작성한 switch 문을 보고 최적의 기계어 코드를 만듭니다. 이때 case 값들이 어떻게 분포해 있는지에 따라 두 가지 주요 기술을 사용합니다.
tableswitchcase 값들이 촘촘하게 연속적으로 분포할 때 (예: case 1, 2, 3, 4, ...).switch에 들어온 값이 배열의 인덱스가 되어, 해당 인덱스의 메모리 주소로 한 번에 '점프'합니다. 이것이 바로 O(1) 성능의 비결입니다.lookupswitchcase 값들이 드문드문 흩어져 있을 때 (예: case 10, 100, 5000, ...).if-else-if보다는 훨씬 빠릅니다.관련해서 https://jaehee329.tistory.com/47 게시글과 해당 글의 댓글에 있는 링크도 참고하면 좋을듯
case가 단 1~2개일 경우: if-else와 성능 차이가 거의 없거나, JIT 컴파일러가 두 코드를 비슷하게 최적화할 수 있습니다.String 타입 switch: Java 7부터 String으로 switch를 사용할 수 있게 되었습니다. 이는 내부적으로 문자열의 hashCode() 값을 사용하는 switch와, 해시 충돌 시 .equals()로 비교하는 if문의 조합으로 동작합니다. 일반적으로 if-else 체인보다는 효율적입니다.