참고
자바의 정석
열거형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.
class Card {
enum Kind {CLOVER, HEART, DIAMOND, SPADE}
enum Value {TWO, THREE, FOUR}
final Kind kind;
final Value value;
}
자바의 열거형은 '타입에 안전한 열거형'이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 타입에 안전하다고 하는 것이다. 그리고 상수같은 경우에는 값이 바뀌면 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 하지만 열거형 상수를 사용하면 기존의 소스를 다시 컴파일 하지 않아도 된다.
열거형을 정의하는 방법은 아래와 같이 상수의 이름을 나열하기만 하면 된다.
enum 열거형이름 {상수명1, 상수명2, ...}
열거형 상수간의 비교에는 '=='를 사용할 수 있다. equals()가 아닌 '=='로 비교가 가능하다는 것은 그만큼 빠른 성능을 제공한다. 하지만 비교연산자는 사용이 불가능하고 compareTo() 메서드를 이용하여 비교를 해야한다.
| 메서드 | 설명 |
|---|---|
| Class< E > getDeclaringClass() | 열거형의 Class 객체를 반환한다. |
| String name() | 열거형 상수의 이름을 문자열로 반환한다. |
| int ordinal() | 열거형 상수가 정의된 순서를 반환한다. (0부터 시작) |
| T valueOf(Class< T > enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다. |
열거형의 상수의 값이 불연속적인 경우에는 이때는 아래와 같이 열거형 상수의 이름 옆에 원하는 값을 괄호()와 함께 적어주면 된다.
enum Direction {EAST(1), SOUTH(5), WEST(-1), NORTH(10)}
그리고 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 추가해주어야 한다.
⚠️ 주의
먼저 열거형 상수를 정의한 다음에 다른 멤버들을 추가해야 한다. 또한, 열거형에 생성자를 만들어도 객체를 생성할 수 없다. 그 이유는 열거형 생성자는 묵시적으로 접근제어자가 private이기 때문이다.
또한, 하나의 열거형 상수에 여러 값을 지정해줘야한다. 단, 그에 맞게 생성자와 인스턴스 변수를 정의해줘야 한다.
열거형에 추상메서드를 선언하면, 각 열거형 상수가 이 추상 메서드를 반드시 구현해야 한다.
열거형의 내부적으로 어떻게 구현이 되어 있을 까? 사실은 열거형 상수 하나하나가 열거형 타입의 객체이다.