기본 패턴
java
enum Status {
ACTIVE, INACTIVE, PENDING
}
Status s = Status.ACTIVE;
// switch expression과 함께 — 모든 케이스 처리 강제
String label = switch (s) {
case ACTIVE -> "활성";
case INACTIVE -> "비활성";
case PENDING -> "대기";
};설명
문자열 상수 대신 enum을 쓰는 이유
"ACTIVE" 같은 문자열 상수는 오타가 컴파일 타임에 잡히지 않고, 허용되지 않는 값("ACTVE")이 전달돼도 컴파일러가 막지 못합니다. enum은 허용된 값의 집합을 타입으로 정의하므로 잘못된 값이 아예 들어올 수 없습니다.
java
// ❌ 문자열 상수 — 오타, 잘못된 값 컴파일 타임에 감지 불가
void process(String status) {
if (status.equals("ACTVE")) { ... } // 오타지만 컴파일 통과
}
process("INVALID"); // 런타임까지 문제 없음
// ✅ enum — 잘못된 값은 컴파일 오류
void process(Status status) { ... }
process(Status.ACTIVE); // ✅
process("ACTIVE"); // 컴파일 오류 — String은 Status가 아님enum에 필드와 메서드 추가
Java의 enum은 단순한 상수 목록이 아닙니다. 각 상수에 데이터를 붙이고 메서드를 정의할 수 있습니다. 상수마다 다른 동작이 필요할 때 switch 없이 enum 자체에서 처리할 수 있습니다.
java
enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6);
private final double mass; // kg
private final double radius; // m
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// 표면 중력 계산
double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
double earthGravity = Planet.EARTH.surfaceGravity(); // 9.80...switch expression + enum — 누락 케이스를 컴파일 타임에 강제
switch expression이 enum을 다룰 때 default 없이 모든 케이스를 나열하면, 새 enum 값이 추가됐을 때 컴파일 오류가 발생합니다. 이 패턴은 코드 전체에서 새 상태 처리를 강제하는 강력한 안전망입니다.
java
enum Priority { LOW, MEDIUM, HIGH }
// default 없이 전체 열거 — 새 케이스 추가 시 컴파일 오류
int score = switch (priority) {
case LOW -> 1;
case MEDIUM -> 5;
case HIGH -> 10;
// Priority.URGENT 추가 시 여기서 컴파일 오류 발생
};
// name(), ordinal() — 내장 메서드
Priority p = Priority.HIGH;
System.out.println(p.name()); // "HIGH"
System.out.println(p.ordinal()); // 2 (0부터 시작)
// 문자열 → enum 변환
Priority fromString = Priority.valueOf("MEDIUM"); // Priority.MEDIUM빠른 정리
| 상황 | 선택 |
|---|---|
| 고정된 상태·옵션 집합 | enum |
| 상수마다 다른 데이터 필요 | enum 필드 + 생성자 |
| 모든 케이스 처리 강제 | switch expression + default 없이 전체 열거 |
| enum → 문자열 | name() |
| 문자열 → enum | valueOf("NAME") |
| enum 전체 목록 | values() |
주의할 점
Enum.valueOf()는 대소문자를 정확히 맞춰야 하고, 없는 이름이면 IllegalArgumentException이 발생합니다. 외부 입력을 변환할 때는 반드시 예외 처리를 하거나 name() 비교를 활용하세요.
java
// ❌ 외부 입력을 바로 valueOf — 예외 위험
String input = "active"; // 소문자
Status s = Status.valueOf(input); // IllegalArgumentException
// ✅ 대소문자 정규화 후 변환
try {
Status s = Status.valueOf(input.toUpperCase());
} catch (IllegalArgumentException e) {
// 알 수 없는 상태 처리
}
// ✅ 또는 스트림으로 안전하게 검색
Optional<Status> s = Arrays.stream(Status.values())
.filter(v -> v.name().equalsIgnoreCase(input))
.findFirst();참고 링크
2 sources