1. 왜 만들어졌을까?

결제 상태를 문자열로 관리하면?

public final class PaymentStatusCodes {
    public static final String READY = "READY";
    public static final String PAID = "PAID";
    public static final String FAILED = "FAILED";
}

public class PaymentService {
    public void changeStatus(String status) {
        System.out.println("결제 상태 변경: " + status);
    }

    public static void main(String[] args) {
        PaymentService paymentService = new PaymentService();

        paymentService.changeStatus(PaymentStatusCodes.PAID);
        paymentService.changeStatus("ADMIN");
        paymentService.changeStatus("UNKNOWN");
    }
}

문제는 바로 여기서 시작됩니다

즉, static final 상수는 상수 집합은 만들 수 있어도 도메인 타입은 만들지 못합니다.

더 나은 방법은 없을까?

결제 상태를 문자열이 아니라 아예 타입으로 만들면 됩니다.

그 답이 enum입니다.


2. Enum을 쓰면 무엇이 달라질까?

상태 집합을 타입으로 만들기

public enum PaymentStatus {
    READY,
    PAID,
    FAILED
}

public class PaymentService {
    public void changeStatus(PaymentStatus status) {
        System.out.println("결제 상태 변경: " + status);
    }
}

이제 아래 코드는 컴파일되지 않습니다.

PaymentService paymentService = new PaymentService();
paymentService.changeStatus(PaymentStatus.PAID);
paymentService.changeStatus("ADMIN"); <-- 문제 발생

핵심 차이: Type Safety

String 기반 상수는 값 비교에 의존합니다.