|

자바 enum은 상수 모음보다 더 강하다: 필드와 메서드를 넣는 이유

자바 enum 필드 메서드 상수 타입 대표 이미지
Java enum은 이름 있는 상수를 타입으로 묶고, 그 안에 필드와 메서드를 둘 수 있습니다.

자바 enum은 단순히 `RED`, `BLUE` 같은 상수 이름을 모아두는 문법이 아닙니다. 값의 종류를 제한하면서도 각 값에 데이터와 동작을 붙일 수 있는 타입입니다.

핵심은 enum을 문자열 상수 대체재가 아니라 의미 있는 제한된 타입으로 보는 것입니다. 이 글은 Java 공식 enum 튜토리얼과 API 문서를 기준으로 필드와 메서드를 넣는 이유를 설명합니다.

자바 enum 사용 기준 요약 카드
enum은 값의 목록을 제한하면서도 각 값에 의미와 동작을 붙일 수 있습니다.

자바 enum을 상수 모음으로만 보면 아쉬운 이유

enum은 값의 후보가 정해져 있을 때 사용하는 타입입니다. 문자열이나 숫자 상수보다 오타에 강하고, 가능한 값의 범위를 코드가 직접 표현합니다.

enum OrderStatus {
    READY,
    PAID,
    SHIPPED,
    CANCELED
}

이렇게 하면 `OrderStatus` 타입에는 위 네 값만 들어갈 수 있습니다. 단순 문자열보다 상태의 의미가 훨씬 분명합니다.

필드를 넣으면 값마다 데이터를 가질 수 있다

enum HttpStatusGroup {
    SUCCESS(200, "성공"),
    CLIENT_ERROR(400, "클라이언트 오류"),
    SERVER_ERROR(500, "서버 오류");

    private final int code;
    private final String description;

    HttpStatusGroup(int code, String description) {
        this.code = code;
        this.description = description;
    }
}

enum 생성자는 private 성격으로 동작하며, enum 상수 선언에서 필요한 값을 넘깁니다. 이렇게 하면 상수와 그 설명을 따로 관리하지 않아도 됩니다.

메서드를 넣으면 분기를 줄일 수 있다

상태별로 조금씩 다른 판단이 필요할 때 매번 switch를 쓰면 분기가 여러 곳으로 퍼집니다. enum 안에 메서드를 두면 값과 행동을 더 가깝게 묶을 수 있습니다.

enum Grade {
    A(90),
    B(80),
    C(70);

    private final int minimumScore;

    Grade(int minimumScore) {
        this.minimumScore = minimumScore;
    }

    boolean matches(int score) {
        return score >= minimumScore;
    }
}

enum은 값의 목록과 그 값에 딸린 규칙을 함께 보관할 수 있습니다. 그래서 상수 클래스보다 도메인 의미를 더 잘 드러낼 때가 있습니다.

switch와 함께 쓸 때도 타입이 살아 있다

String message = switch (status) {
    case READY -> "결제 대기";
    case PAID -> "배송 준비";
    case SHIPPED -> "배송 완료";
    case CANCELED -> "취소";
};

enum과 switch를 함께 쓰면 가능한 값이 제한되어 있어 분기 누락을 더 쉽게 확인할 수 있습니다. 다만 분기가 여러 곳에 반복된다면 enum 메서드로 옮길 수 있는지 검토해 볼 만합니다.

언제 enum이 잘 맞을까

  • 가능한 값의 목록이 작고 비교적 안정적일 때
  • 문자열 상수보다 타입으로 제한하고 싶을 때
  • 각 값에 설명, 코드, 우선순위 같은 데이터가 붙을 때
  • 값별 판단 로직이 여러 곳에 흩어질 때

언제 조심해야 할까

  • 값 목록이 DB나 관리자 화면에서 자주 바뀌어야 할 때
  • 너무 많은 비즈니스 로직을 enum에 몰아넣을 때
  • 외부 시스템 코드와 1:1로 고정되어 변경 여지가 큰 때
  • 단순 설정 데이터까지 모두 enum으로 만들 때

정리

자바 enum은 상수 모음보다 강한 타입입니다. 값의 후보를 제한하고, 각 값에 데이터와 동작을 붙일 수 있기 때문에 상태나 분류를 표현할 때 좋은 선택이 될 수 있습니다.

Java 기본 문법 흐름은 자바 static과 final 차이, 자바 final, finally, finalize 차이, 자바 오버로딩과 오버라이딩 차이와 함께 보면 좋습니다. 외부 기준은 Oracle Java Tutorial – Enum Types, Java API – Enum, Java Language Specification 8.9 – Enum Classes를 확인했습니다.

함께보면 좋은 글