Java - Enum

develkkm·2025년 12월 11일

0부터 시작하는 Java

목록 보기
25/27

자바에서 상태, 등급, 카테고리 같은 값을 표현할 때 가장 먼저 떠올리는 것은 문자열이다.
하지만 문자열은 오타·유효성·일관성 문제를 피할 수 없기 때문에 자바는 열거형(Enum)이라는 강력한 대안을 제공한다.


문자열

public int discount(String grade, int price) {
    if (grade.equals("BASIC")) return price * 10 / 100;
    if (grade.equals("GOLD")) return price * 20 / 100;
    if (grade.equals("DIAMOND")) return price * 30 / 100;
    return 0;
}
  • "GOLD""gold" 같은 대소문자 문제
  • "DIAMONDD" 같은 오타 입력 가능
  • "VIP" 같은 유효하지 않은 값 전달 가능
  • 컴파일 시점 검증 불가

상수

public class StringGrade {
    public static final String BASIC = "BASIC";
    public static final String GOLD = "GOLD";
    public static final String DIAMOND = "DIAMOND";
}
discount("VIP", price); // 여전히 잘못된 값 입력 가능

근본적 해결은 되지 않는다.
왜냐하면 타입 자체가 String이기 때문이다.


Pattern

자바 5 이전에는 아래와 같은 방식으로 직접 열거형을 흉내냈다.

public class ClassGrade {
    public static final ClassGrade BASIC = new ClassGrade();
    public static final ClassGrade GOLD = new ClassGrade();
    public static final ClassGrade DIAMOND = new ClassGrade();

    private ClassGrade() {} // 외부 생성 금지
}

특징

  • 정해진 3개의 인스턴스만 존재
  • == 비교 가능
  • 문자열 입력 문제 해결

단점

  • 구현이 번거롭고 패턴을 매번 작성해야 했다.

Enum

public enum Grade {
    BASIC, GOLD, DIAMOND
}

자바 enum은 타입 안전 열거형 패턴을 언어 차원에서 지원한다.

특징

  • 외부에서 인스턴스 생성 불가
  • 사전에 정의된 값만 사용 가능 → 완전한 타입 안전성 확보
  • 실제로는 각각의 값이 싱글턴 인스턴스

예시

public enum Grade {
    BASIC(10), GOLD(20), DIAMOND(30);

    private final int discountPercent;

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

    public int discount(int price) {
        return price * discountPercent / 100;
    }
}

사용

int result = Grade.GOLD.discount(10000); // 2000

장점

  • 할인 로직을 Grade 내부에 캡슐화
  • 새로운 등급 추가 시 확장성 ↑

주요 메서드

메서드설명
values()모든 enum 상수 배열 반환
valueOf(String)문자열 → enum 변환
name()상수 이름 반환
ordinal()선언 순서(0부터) — 사용 비추천

ordinal()

중간에 상수를 추가하면 기존 순서가 모두 바뀌어 데이터 불일치가 발생할 수 있음.

profile
알던것을 더 확실하게

0개의 댓글