-
열거 타입이란 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다.
-
열거 타입 지원 이전에는 정수 열거 패턴 기법을 사용했다.
public static fianl int APPLE_FUJI = 0; public static fianl int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2;
- 정수 열거 패턴 기법은 타입 안전을 보장할 방법이 없으며 표현력이 좋지 않다.
-
열거 타입(enum type)은 열거 패턴의 단점을 해소하는 동시에 여러 장점을 가진다.
// 가장 단순한 열거 타입
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { NAVEL, TEMPLE, BLOOD }
-
자바의 열거 타입은 완전한 형태의 클래스이기 때문에, 다른 언어의 열거 타입보다 훨씬 강력하다.
-
열거 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어
public static final
필드로 공개한다.- 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상
final
이다. final
이기 때문에 클라이언트가 인스턴스를 직접 생성하거나 확장할 수 없고, 열거 타입으로 만들어진 인스턴스는 딱 하나씩만 존재한다.
- 열거 타입은 밖에서 접근할 수 있는 생성자를 제공하지 않으므로 사실상
-
열거 타입은 컴파일타임 타입 안정성을 제공한다.
- 열거 타입을 매개변수로 받는 메서드를 선언했다면, 건네받은 참조는
null
이 아닌,Enum type
값 중 하나이다. - 열거 타입에는 각자의 이름 공간이 있기 때문에, 이름이 같은 상수도 공존할 수 있다.
- 열거 타입에 새로운 상수를 추가하거나 순서를 바꿔도 컴파일하지 않아도 된다.
- 공개되는 것이 필드의 이름 뿐이기 때문에, 상수 값이 클라이언트로 컴파일되어 각인되지 않는다.
- 열거 타입을 매개변수로 받는 메서드를 선언했다면, 건네받은 참조는
-
열거 타입은 임의의 메서드나 필드를 추가할 수 있고, 임의의 인터페이스를 구현할 수도 있다.
-
e.g. 태양계를 열거 타입으로 나타낸 코드
public enum Planet { MERCURY(3.302e+32, 2.439e6), VENUS (4.869e+24, 6.052e6), ERATH (5.975e+24, 6.378e6), MARS (6.419e+23, 3.393e6), JUPITER(1.899e+27, 7.149e7), SATURN (5.685e+26, 6.027e7), URANUS (8.683e+25, 2.556e7), NEPTUNE(1.024e+26, 2.477e7); private final double mass; private final double radius; private final dobule surfaceGravity; private static final double G = 6.67300E-11; Planet(double mass, double radius) { this.mass = mass; this.radius = radius; surfaceGravity = G * mass / (radius * radius); } public double mass() { return mass; } public double radius() { return radius; } public double surfaceGravity() { return surfaceGravity }; public double surfaceWeight(double mass) { return mass * surfaceGravity; } }
-
열거 타입 상수 각각을 특정 데이터와 연결지으려면, 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 된다.
-
열거 타입은 자신 안에 정의된 상수들의 값을 배열에 담아 반환하는 정적 메서드
values
가 있기 때문에toString
메서드를 사용하면 적합한 문자열을 출력한다.toString
을 재정의하여 원하는 대로 출력할 수도 있다.
-
상수별 메서드 구현
switch
문으로 값에 따라 분기하는 열거타입은 좋지 않다.- 열거 타입 별로 다른 동작을 해야 된다면 상수별 메서드를 구현하자.
-
열거 타입 상수 일부가 같은 동작을 공유한다면 전략 열거 타입 패턴을 사용하자!