컴퓨터 프로그래밍에서 Enumerated Type(열거형 타입)을 줄여서 보통 Enum이라고 쓴다. 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다. 열거자 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자이다. - wikipeida -
위키피디아에서 언급된 정의를 바탕으로 정의를 요약해보자면, 상수 값을 대표하는 이름의 멤버들로 집합을 이루는 열거 자료형 타입
이라고 할 수 있다.
여기서 상수란, 변하지 않는 값
으로 정수 뿐만 아니라, 문자열 그 외의 자료형도 얼마든지 상수로 정의할 수 있다.
따로 이름 외 값을 갖지 않는다면 이름이 그 자체로 상수가 된다. 즉, 기본적으로 클래스를 상수처럼 사용할 수 있는 것이다.
enum으로 구현할 경우 다음 Transporation과 같이 Taxi, Bus, Subway를 각각 유일한 인스턴스로 사용할 수 있다.
enum Transportaion {
Taxi,
Bus,
Subway;
}
Taxi, Bus, Subway를 요소로 갖는 Transportation에 기본 요금이라는 상태를 상수값으로 추가할 수 있다.
enum Transportaion {
Taxi(3800),
Bus(1200),
Subway(1250);
private int baseFare;
Transportation(int baseFare) {
this.baseFare = baseFare;
}
}
이렇게 작성하면 각 요소 뒤에 붙는 괄호가 자동으로 생성자 역할을 하게 되어서 전달되는 파라미터로 멤버변수가 초기화되어 각 멤버는 기본요금이라는 상태를 갖게 된다.
기본요금 뿐만아니라, 거리당 요금 인상률을 멤버 변수로 갖고 싶다면 얼마든지 추가할 수 있다. 이처럼 서로 관련 있는 상수 값들을 모아 enum으로 구현할 경우 유용하게 사용할 수 있다.
보통 도메인을 설계할 때
사용하는 인스턴스의 수가 정해져 있고 관련된어 처리할 수 있는 상수값이 여러개 존재할 때
Enum을 사용한다.
예를 들어 로또 프로그램에서 1등부터 5등까지를 의미하는 등수와 각 등수가 만들어 지는 조건, 그리고 각 등수에 해당하는 상금을 묶어낼 필요가 있을 경우에 Enum을 사용하면 외부에서도 Enum의 요소를 조회하여 각 상태에 용이하게 접근할 수 있다.
enum LottoRank {
FIRST(6, false, 2_000_000_000),
SECOND(5, true, 30_000_000),
THIRD(5, false, 1_500_000),
FOURTH(4, false, 50_000),
FIFTH(3, false, 5_000),
NONE(0, false, 0);
}