enum 타입을 다룰 때는 switch문

Xtraa·2025년 7월 23일

Java 기본 개념

목록 보기
7/7

1. 가독성

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 -> "손님 로직 처리";
};

2. 안정성

UserRole에 새로운 등급인 MANAGER가 추가되었다고 가정한다

  • if-else의 경우
    • 코드는 아무런 문제 없이 컴파일된다. 하지만 MANAGER 등급의 사용자가 들어왔을때, 모든 조건을 통과하여 아무 로직도 실행되지 않는 런타임 버그가 발생한다.
  • 향상된 switch의 경우
    • 코드를 컴파일하는 순간, 컴파일러가 바로 에러를 발생시킨다.
    • error: the switch expression does not cover all possible input values

3. 성능

핵심 원리 : Jump Table

컴파일러는 개발자가 작성한 switch 문을 보고 최적의 기계어 코드를 만듭니다. 이때 case 값들이 어떻게 분포해 있는지에 따라 두 가지 주요 기술을 사용합니다.

  1. tableswitch
    • 언제 사용?: case 값들이 촘촘하게 연속적으로 분포할 때 (예: case 1, 2, 3, 4, ...).
    • 원리: 값과 실행할 코드의 메모리 주소를 배열(테이블)로 만듭니다. switch에 들어온 값이 배열의 인덱스가 되어, 해당 인덱스의 메모리 주소로 한 번에 '점프'합니다. 이것이 바로 O(1) 성능의 비결입니다.
  2. lookupswitch
    • 언제 사용?: case 값들이 드문드문 흩어져 있을 때 (예: case 10, 100, 5000, ...).
    • 원리: (값, 주소) 쌍으로 이루어진 정렬된 목록을 만듭니다. 값을 찾을 때 이진 탐색(binary search)과 유사한 효율적인 검색을 수행하여 점프할 주소를 찾습니다. 순차 검색인 if-else-if보다는 훨씬 빠릅니다.

관련해서 https://jaehee329.tistory.com/47 게시글과 해당 글의 댓글에 있는 링크도 참고하면 좋을듯


항상 switch가 빠를까?

  • case가 단 1~2개일 경우: if-else와 성능 차이가 거의 없거나, JIT 컴파일러가 두 코드를 비슷하게 최적화할 수 있습니다.
  • String 타입 switch: Java 7부터 String으로 switch를 사용할 수 있게 되었습니다. 이는 내부적으로 문자열의 hashCode() 값을 사용하는 switch와, 해시 충돌 시 .equals()로 비교하는 if문의 조합으로 동작합니다. 일반적으로 if-else 체인보다는 효율적입니다.
profile
https://xtraa.notion.site/Xtraa-ed48ac432d354d01b5bf5b0da5ec94a9?pvs=4

0개의 댓글