열거형이란 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다.
타입에 안전한 열거형이라고 하는데 실제 값이 같이도 타입이 다르다면 컴파일 에러가 발생한다.
열거형 상수를 사용하면 기존의 소스를 다시 컴파일 하지 않아도 된다.
enum 열거형 이름 { 상수명1, 상수명2, ... }
enum Direction { EAST, SOUTH, WEST, NORTH }
class Unit {
int x, y;
Direction dir;
void init() {
dir = Direction.EAST;
}
}
열거형의 사용은 위와 같이 열거형 이름.상수명
으로 사용한다.
상수간의 비교는 ==
로 할 수 있다. 이것은 equals()
보다 빠른 성능을 제공한다.
대신 >
,<
와 같은 비교연산자는 사용할 수 없고 대신 CompareTo()
를 사용하여 비교할 수 있다.
values()
ordinal()
은 모든 열거형의 조상인 java.lang.Enum
클래스에서 정의된 것으로, 열거형 상수가 정의된 순서(0부터 시작)를 정수로 반환한다.하지만 이 값은 내부적인 용도로만 사용되기 때문에 이값을 열거형 상수의 값으로 사용하지 않는 것이 좋다.
name()
열거형 상수의 이름을 문자열로 반환한다.
valuesOf(String name)
열거형 상수의 이름으로 문자열 상수에 대한 참조를 얻을 수 있게 해준다.
위 처럼 ordinal()
을 사용하지 않고 직접 열거형 상수 값을 설정하여 사용할 수 있다. 이 때 해당 상수 값은 멤버 변수로 선언하고 생성자를 통해 초기화되어야 한다.
이때 여러 상수값을 추가 할 수 있으며 추가할 때 마다 멤버 변수와 생성자 매개변수도 같이 추가되어야 한다.
여기서 열거형 생성자는 외부에서 호출할 수 없다. 열거형 생성자는 private
가 없지만 묵시적으로 private
라고 약속했기 때문이다.
그리고 열거형 상수 값을 이용한 메서드도 만들 수 있다.