
자바에서 상태, 등급, 카테고리 같은 값을 표현할 때 가장 먼저 떠올리는 것은 문자열이다.
하지만 문자열은 오타·유효성·일관성 문제를 피할 수 없기 때문에 자바는 열거형(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이기 때문이다.
자바 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() {} // 외부 생성 금지
}
특징
== 비교 가능 단점
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
장점
| 메서드 | 설명 |
|---|---|
| values() | 모든 enum 상수 배열 반환 |
| valueOf(String) | 문자열 → enum 변환 |
| name() | 상수 이름 반환 |
| ordinal() | 선언 순서(0부터) — 사용 비추천 |
중간에 상수를 추가하면 기존 순서가 모두 바뀌어 데이터 불일치가 발생할 수 있음.