자바에서 열거 타입을 지원하기 전에는 정수 열거 패턴을 사용함
public static final int APPLE_FUHI = 0;
public static final int APPLE_PIPPEN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL= 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;
단점
타입 안전을 보장할 방법이 없음
→ APPLE_FUHI와 ORANGE_NAVEL이 같은 값을 가지는데 이를 사용하는 곳에서 구분할 방법이 없음 (APPLE_FUHI와 ORANGE_NAVEL은 같은 값을 가지기 때문)
정수 열거 패턴을 사용한 프로그램은 깨지기 쉬움
→ 컴파일하면 그 값이 클라이언트 파일에 그대로 새겨지므로 상수 값이 바뀌면 클라이언트도 반드시 다시 컴파일해야 함
public static final int STATUS_ACTIVE = 1;
public static final int STATUS_INACTIVE = 0;
/////위와 같은 상수가 정의되어 있다고 하자...
////아래는 클라이언트 코드임!
if (status == STATUS_ACTIVE) {
}
문자열로 출력하기 까다로움
정수 대신 문자열 상수를 사용(문자열 열거 패턴)하면 상수의 의미는 출력할 수 있지만 문자열 값을 그대로 하드코딩하게 만들 수 있음
public static final int APPLE_FUHI = "apple_fuhi";
public enum Apple {FUJI, PIPPN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
열거 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개함
밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상 final임
→ 열거 타입 선언으로 만들어진 인스턴스들은 딱 하나씩만 존재하게 됨
→ 싱글턴을 일반화한 형태
컴파일타임 타입 안전성을 제공
→ Apple 열거 타입을 사용한다면, 해당 변수는 Apple의 세 가지 값 중 하나임
→ Apple타입의 변수에 다른 타입의 값을 할당하는 실수 방지 가능
열거 타입에 새로운 상수를 추가하거나 순서를 바꿔도 기존 코드를 다시 컴파일하지 않아도 됨
→ 공개되는 것은 필드의 이름 뿐
열거타입의 toString 메서드는 출력하기 적합한 문자열을 줌
열거 타입에는 임의의 메서드나 필드를 추가할 수 있고 임의의 인터페이스를 구현하게 할 수 있음
각 상수와 연관된 데이터를 상수 자체에 내재시키고 싶은 경우
열거 타입 상수 각각을 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장할 수 있음
예시 코드
public enum Planet {
MERCURY(3.302e+23, 2.439e6),
VENUS(4.869e+24, 6.052e6),
EARTH(5.975e+24, 6.378e6),
MARS(6.419e+23, 3.393e6);
private static final double G = 6.67300E-11;
private final double mass;
private final double radius;
private final double surfaceGravity;
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
this.surfaceGravity = G * mass / (radius * radius);
}
public double surfaceWeight(double mass) {
return this.mass * this.surfaceGravity;
}
}