0Pricing
Java Academy · 강의

열거형을 사용한 switch 표현식

깔끔하고 빠짐없는 분기를 위해 최신 switch 표현식을 열거형과 함께 사용합니다.

열거형을 사용한 switch 표현식은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

열거형을 사용하는 스위치 식

열거형과 함께 사용하는 스위치 식(Java 14 이상)은 모든 경우를 빠짐없이 처리하는 간결한 형식 기반 분기를 제공합니다. 모든 열거형 상수를 다루면 default가 필요하지 않습니다.

전통적인 스위치 문

기존 스위치 문은 열거형과 함께 사용할 수 있지만 다음 분기로 넘어가는 것을 막으려면 break가 필요합니다.

enum Severity { LOW, MEDIUM, HIGH, CRITICAL }

Severity s = Severity.HIGH;
String action;
switch (s) {
    case LOW:
        action = "Log and monitor";
        break;
    case MEDIUM:
        action = "Notify on-call team";
        break;
    case HIGH:
        action = "Page engineer immediately";
        break;
    case CRITICAL:
        action = "Activate incident response";
        break;
    default:
        action = "Unknown";
}
System.out.println(action); // Page engineer immediately

화살표 레이블을 사용하는 스위치 식

화살표 레이블을 사용하는 스위치 식은 다음 분기로 넘어가는 동작과 break를 없앱니다. 값을 계산하여 반환하며 모든 경우를 처리해야 합니다.

enum Severity { LOW, MEDIUM, HIGH, CRITICAL }

Severity s = Severity.HIGH;
String action = switch (s) {
    case LOW      -> "Log and monitor";
    case MEDIUM   -> "Notify on-call team";
    case HIGH     -> "Page engineer immediately";
    case CRITICAL -> "Activate incident response";
    // no default needed — all cases covered
};
System.out.println(action); // Page engineer immediately

블록을 사용하는 스위치 식

분기 로직에 여러 문장이 필요할 때는 yield를 사용하는 블록으로 결과 값을 생성합니다.

enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN }

DayOfWeek day = DayOfWeek.FRI;
int hoursOpen = switch (day) {
    case MON, TUE, WED, THU -> 8;
    case FRI -> {
        System.out.println("Half day on Friday!");
        yield 4;  // yield returns value from block
    }
    case SAT, SUN -> 0;
};
System.out.println("Hours open: " + hoursOpen); // Hours open: 4

여러 case 묶기

여러 열거형 상수는 쉼표로 구분하여 같은 case를 공유할 수 있습니다.

enum Season { SPRING, SUMMER, FALL, WINTER }

Season season = Season.SUMMER;
String activity = switch (season) {
    case SPRING, FALL -> "Hike in the mountains";
    case SUMMER       -> "Beach vacation";
    case WINTER       -> "Ski at the resort";
};
System.out.println(activity); // Beach vacation

switch로 메서드에서 반환하기

switch 표현식은 메서드의 반환문으로 사용하면 의도를 명확하게 표현할 수 있어 매우 유용합니다.

enum Priority { LOW, NORMAL, HIGH, URGENT }

static int getSlaHours(Priority p) {
    return switch (p) {
        case LOW    -> 72;
        case NORMAL -> 24;
        case HIGH   -> 4;
        case URGENT -> 1;
    };
}

System.out.println(getSlaHours(Priority.URGENT)); // 1
System.out.println(getSlaHours(Priority.LOW));    // 72

stream에서 switch 표현식 사용하기

stream 연산 내부에서 switch 표현식을 사용하면 각 요소를 깔끔하게 변환할 수 있습니다.

import java.util.*;
import java.util.stream.*;

enum Status { PENDING, ACTIVE, CLOSED }

record Account(String id, Status status) {}

List<Account> accounts = List.of(
    new Account("A1", Status.ACTIVE),
    new Account("A2", Status.PENDING),
    new Account("A3", Status.CLOSED)
);

accounts.stream()
    .map(a -> a.id() + ": " + switch (a.status()) {
        case ACTIVE  -> "\u2705 Live";
        case PENDING -> "\u23f3 Awaiting activation";
        case CLOSED  -> "\u274c Deactivated";
    })
    .forEach(System.out::println);

컴파일 시 모든 경우 처리 확인

컴파일러는 모든 열거형 상수가 처리되는지 확인합니다. 열거형에 새 상수를 추가하면 해당 상수를 처리하지 않는 모든 switch 표현식에서 컴파일 오류가 발생합니다.

enum Color { RED, GREEN, BLUE }  // add YELLOW here → compile error below

Color c = Color.GREEN;
// This switch is exhaustive for RED, GREEN, BLUE
// If you add YELLOW to the enum without adding a case here,
// the compiler will report an error.
String hex = switch (c) {
    case RED   -> "#FF0000";
    case GREEN -> "#00FF00";
    case BLUE  -> "#0000FF";
};
System.out.println(hex); // #00FF00

안전성을 위한 switch의 default

switch문을 사용하거나 일부 case만 의도적으로 처리하는 경우에는 default case를 추가하십시오.

enum Feature { DARK_MODE, PUSH_NOTIFICATIONS, ANALYTICS, BETA_FEATURE }

static boolean isEnabled(Feature feature) {
    return switch (feature) {
        case DARK_MODE, PUSH_NOTIFICATIONS -> true;
        case ANALYTICS                     -> false;
        default -> {
            System.out.println("Unknown feature: " + feature);
            yield false;
        }
    };
}
System.out.println(isEnabled(Feature.DARK_MODE));     // true
System.out.println(isEnabled(Feature.BETA_FEATURE));  // false

실습: 주문 수명 주기

switch 표현식으로 허용된 상태 전환을 결정하는 완전한 주문 수명 주기 상태 머신입니다.

enum OrderState { CART, PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED }

static Set<OrderState> allowedTransitions(OrderState from) {
    return switch (from) {
        case CART      -> Set.of(OrderState.PENDING, OrderState.CANCELLED);
        case PENDING   -> Set.of(OrderState.CONFIRMED, OrderState.CANCELLED);
        case CONFIRMED -> Set.of(OrderState.SHIPPED);
        case SHIPPED   -> Set.of(OrderState.DELIVERED);
        case DELIVERED, CANCELLED -> Set.of(); // terminal states
    };
}
System.out.println(allowedTransitions(OrderState.PENDING));
// [CONFIRMED, CANCELLED]

String과 열거형에 사용하는 switch 비교

String을 대상으로 switch를 사용하려면 null 확인이 필요하며 대소문자를 구분합니다. 열거형을 대상으로 하는 switch는 null을 안전하게 처리하지만 null이면 NPE가 발생하고 타입 안전성도 보장됩니다. 가능한 값의 집합이 정해져 있다면 열거형을 우선 사용하십시오.

// String switch — fragile
String role = "admin";
String label = switch (role.toLowerCase()) {
    case "admin" -> "Administrator";
    case "guest" -> "Guest User";
    default      -> "Unknown";
};

// Enum switch — type-safe
enum Role { ADMIN, GUEST }
Role r = Role.ADMIN;
String label2 = switch (r) {
    case ADMIN -> "Administrator";
    case GUEST -> "Guest User";
};
System.out.println(label2); // Administrator

빠른 확인

상수가 4개인 열거형이 있고 4개 모두를 처리하는 switch 표현식을 작성했습니다. 열거형에 5번째 상수를 추가하면 어떻게 될까요?

복습: 열거형을 사용하는 switch 표현식

핵심 내용:

  • 화살표 레이블 switch 표현식은 break와 폴스루를 없앱니다
  • 블록 case에서 값을 반환하려면 yield를 사용합니다
  • 쉼표로 여러 상수를 묶습니다: case A, B ->
  • 모든 상수를 처리하는 완전한 switch 표현식에는 default가 필요하지 않습니다
  • 새 열거형 상수를 추가하면 완전한 switch 표현식에서 컴파일 오류가 발생합니다
  • switch 표현식은 stream의 map() 연산에서 사용하기 좋습니다

자주 묻는 질문

“열거형을 사용한 switch 표현식” 강의는 무료인가요?

네 — “열거형을 사용한 switch 표현식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“열거형을 사용한 switch 표현식”에서 뭘 배우나요?

깔끔하고 빠짐없는 분기를 위해 최신 switch 표현식을 열거형과 함께 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“열거형을 사용한 switch 표현식” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 열거형 정의와 사용
  2. 필드와 메서드를 포함한 열거형
  3. 열거형을 사용한 switch 표현식
  4. EnumSet과 EnumMap
← Java Academy(으)로 돌아가기