Java enum (열거형)
Java의 enum (enumeration, 열거형)은 서로 관련된 상수들을 모아둔, 고정된 집합을 표현하는 특별한 데이터 타입이다. enum을 사용하면 코드의 가독성과 안정성을 높이고, 오류 발생 가능성을 줄일 수 있다.
1. enum이란?
- 상수 집합: 요일(월, 화, 수, ...), 계절(봄, 여름, 가을, 겨울), 색상(빨강, 초록, 파랑), 카드 패(스페이드, 하트, 다이아몬드, 클로버) 등과 같이 미리 정해진 몇 가지 값(상수)만을 가질 수 있는 타입을 정의할 때 사용.
- 클래스: enum은 내부적으로 java.lang.Enum 클래스를 상속하는 클래스. 따라서, 필드(멤버 변수), 메서드, 생성자를 가질 수 있다.
- 타입 안전성 (Type Safety): 컴파일 타임에 타입 체크를 하므로, 잘못된 값이 사용될 가능성을 줄여준다.
- 가독성 향상: 의미 있는 이름(상수)을 사용하므로, 코드를 이해하기 쉬워진다.
- switch문과 궁합: enum은 switch문에서 사용할 때 가독성을 높인다.
2. enum 정의 및 사용
- 기본 형태:
- enum 키워드를 사용하여 정의.
- 열거 상수들은 쉼표(,)로 구분하고, 대문자로 쓰는 것이 일반적. (Java Naming Convention)
- 각 열거 상수는 해당 enum 타입의 객체.
-
enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
- Java
- 사용 예시:
-
Java
public class EnumExample { public static void main(String[] args) { DayOfWeek today = DayOfWeek.WEDNESDAY; System.out.println("Today is: " + today); // 출력: Today is: WEDNESDAY System.out.println(today == DayOfWeek.WEDNESDAY); // true (객체 비교) System.out.println(today.name()); // WEDNESDAY System.out.println(today.ordinal()); // 2 (0부터 시작하는 인덱스) // 모든 enum 상수 순회 for (DayOfWeek day : DayOfWeek.values()) { System.out.println(day); } DayOfWeek someday = DayOfWeek.valueOf("FRIDAY"); //문자열로 enum상수 가져오기. // switch 문에서 사용 switch (today) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: case FRIDAY: System.out.println("Weekday"); break; case SATURDAY: case SUNDAY: System.out.println("Weekend"); break; } } }
3. enum 필드(멤버 변수) 및 메서드
enum은 클래스이므로, 필드와 메서드를 가질 수 있다. 이를 통해 각 열거 상수에 추가적인 정보를 연결하거나, 동작을 정의할 수 있다.
Java
enum Planet {
MERCURY(3.303e+23, 2.4397e6), // 질량(kg), 반지름(m)
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6),
MARS(6.421e+23, 3.3972e6),
JUPITER(1.9e+27, 7.1492e7),
SATURN(5.688e+26, 6.0268e7),
URANUS(8.686e+25, 2.5559e7),
NEPTUNE(1.024e+26, 2.4746e7);
private final double mass; // kg
private final double radius; // m
// 생성자 (private만 가능)
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
// 메서드
public double getMass() {
return mass;
}
public double getRadius() {
return radius;
}
// static 메서드 (상수 G는 모든 행성에 공통)
public static final double G = 6.67300E-11;
// 표면 중력 계산 메서드
public double surfaceGravity() {
return G * mass / (radius * radius);
}
}
public class PlanetExample {
public static void main(String[] args){
Planet earth = Planet.EARTH;
System.out.println("Earth's mass: " + earth.getMass() + " kg");
System.out.println("Earth's radius: " + earth.getRadius() + " m");
System.out.println("Earth's surface gravity: " + earth.surfaceGravity() + " m/s^2");
System.out.println(Planet.valueOf("EARTH").getMass());
}
}
- 필드: 각 열거 상수에 대한 정보를 저장. (예: 행성의 질량, 반지름)
- 생성자:
- enum 생성자는 항상 private이어야 한다. (외부에서 new로 객체 생성 불가)
- 열거 상수를 정의할 때, 괄호 안에 생성자에 전달할 값을 지정.
- 메서드: 일반적인 메서드와 동일하게 정의하고 사용할 수 있다.
- static 메서드도 정의할 수 있다.
4. java.lang.Enum 클래스 (상위 클래스)
모든 enum은 java.lang.Enum 클래스를 자동으로 상속. Enum 클래스는 다음과 같은 유용한 메서드들을 제공.
- name(): String - 열거 상수의 이름을 문자열로 반환.
- ordinal(): int - 열거 상수의 순서(0부터 시작)를 반환.
- values(): (static) - 해당 enum의 모든 열거 상수를 배열로 반환.
- valueOf(String name): (static) - 지정된 이름(name)과 일치하는 열거 상수를 반환. (없으면 IllegalArgumentException)
5. enum 활용
- 상태 표현: 객체의 상태(예: 주문 상태 - 대기, 처리 중, 완료, 취소)를 나타내는 데 유용.
- 전략 패턴 (Strategy Pattern): 알고리즘(전략)을 런타임에 선택할 수 있도록 하는 디자인 패턴에서, 각 전략을 enum 상수로 표현할 수 있다.
- 싱글톤 패턴 (Singleton Pattern): enum을 사용하면 스레드 안전하고 간결하게 싱글톤 패턴을 구현할 수 있다. (Effective Java에서 권장하는 방법)
Java
public enum Singleton { INSTANCE; }
6. enum vs. 상수 클래스 (int 상수, String 상수)
- int 상수, String 상수:
Java
// int 상수 public static final int STATUS_PENDING = 0; public static final int STATUS_PROCESSING = 1; public static final int STATUS_COMPLETED = 2; // String 상수 public static final String COLOR_RED = "RED"; public static final String COLOR_GREEN = "GREEN"; public static final String COLOR_BLUE = "BLUE";
- enum의 장점:
- 타입 안전성: int 상수나 String 상수는 잘못된 값을 할당할 수 있지만, enum은 컴파일 타임에 타입 체크를 하므로 오류를 방지.
- 가독성: 의미 있는 이름을 사용하므로 코드를 이해하기 쉽다.
- 확장성: 필드와 메서드를 추가하여 각 상수에 대한 부가적인 정보나 동작을 정의할 수 있다.
- switch 문: switch 문에서 사용할 때 코드가 간결하고 가독성이 좋다.
'개발 > Java' 카테고리의 다른 글
예외 (0) | 2025.03.27 |
---|---|
java.time (0) | 2025.03.14 |
java.util.Date (0) | 2025.03.14 |
[Java] equals() 와 hashCode() (0) | 2025.01.24 |
[Java] 자바 객체와 관련된 용어 정리 (0) | 2025.01.24 |