[Java] 열거형(Enumeration Type)
열거형(Enum)은 Java 5 에서 추가된 자료형으로 의미가 부여된 이름을 갖는 상수의 선언에 목적이 있다.
Java 5 이전의 상수 선언과 문제점
interface Animal {
int DOG = 1;
int CAT = 2;
}
인터페이스 내에 선언된 변수는 public, static, final이 선언된 것으로 간주된다. 이러한 상수의 선언은 큰 문제를 하나 가지고 있다.
interface Person {
int MAN = 1;
int WOMAN = 2;
}
public static void who(int man) {
swtich(man) { ... }
}
Who(Person.MAN); // 정상적인 호출
who(Animal.DOG); // 비정상적인 호출 => 오류 발생 안함
잘못된 상수를 집어 넣었지만 값이 같기 때문에, 컴파일 오류와 실행 오류 모두 발생하지 않는다.
열거형(Enumeration Type)
enum Animal {
DOG, CAT;
}
이러한 문제점의 해결을 위해 Java 5에서 열거형(Enumberation Type)이 추가되었다. 열거형 안에 위치한 값들은 열거형 값(Enumerated Values)이라고 한다. 모든 열거형은 java.lang.Enum<E> 클래스를 상속한다.
Animal a = Animal.DOG;
클래스와 성격이 유사해 참조변수의 선언이 가능하며, 선언된 참조변수는 열거형 내에 선언된 열거형 값만 대입 가능하다.
enum Person {
MAN, WOMAN;
}
Animal a = Person.MAN;
열거행을 사용한다면 잘못된 값을 대입한다면 자료형 불일치로 컴파일 오류가 발생한다. 앞서 언급한 문제점이 해결된 것을 볼 수 있다.
class Person {
public static final Person MAN = new Person();
public static final Person WOMAN = new Person();
}
enum Person {
MAN, WOMAN;
}
열거형은 사실 클래스 내부에서 선언된 public static final 인스턴스 값과 동일하다.
열거형의 정의에 생성자가 없으면 디폴트 생성자가 삽입되는데 이 생성자는 private로 생성되어 직접 인스턴스 생성이 불가능하다.
enum Person {
MAN(29), WOMAN(25);
int age;
private Person(int age) {
this.age = age;
}
}
인자를 전달받는 열거형을 정의 가능하다. 열거형의 생성자는 반드시 private로 선언해야 하며, 위의 코드처럼 열거형 값의 선언에서 소괄호를 통해 인자를 전달할 수 있다.
열거형도 Object 클래스를 상속하는 일종의 클래스로 생서자, 인스턴스 변수, 메서드 모두 가질수 있다. 다만 모든 생성자는 private로 선언해야만 한다.
참조
윤성우의 열혈 JAVA 프로그래밍
https://www.nextree.co.kr/p11686/