[java] 열거형 enum
참고
Java tutorial : Classes and Objects-Enum Types
생활코딩 - enum
열거형 enum (enumerated type)
enum
타입은 특별한 데이터 타입으로 미리 정의되고 고정된 상수 집합이다. 자바 5 이상 사용 가능
enum
은 class
, interface
와 동급의 형식을 가지는 단위이지만 실상은 class
다. 편의를 위해 enum
만을 위한 문법적 형식을 가지고 있기 때문에 구분하는 것이다.
enum 이름 {
상수1, 상수2, 상수3...;
}
enum Animal {
TIGGER, ZIBRA, SQUIRREL;
}
사실은 아래와 같은 의미이다.
class Animal {
public static final Animal TIGGER = new Animal();
public static final Animal ZIBRA = new Animal();
public static final Animal SQUIRREL = new Animal();
private Animal(){} // 생성자 - private 외부에서 인스턴스 생성 방지용
}
enum의 장점
- 코드가 단순해진다.
- 인스턴스 생성 방지 & 상속 방지 :
enum
은 암시적으로java.lang.Enum
을 확장한다. 즉java.lang.Enum
은enum
의 부모이다. 자바의 다중 상속을 지원 하지 않는 특성 상, 클래스는 하나의 부모만 확장할 수 있고 그로 인해enum
은 다른 것은 확장할 수 없다. - 키워드
enum
을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
.values()
.values()
메서드는 특별한 메서드로 선언된 순서대로 enum
의 모든 값을 가지는 배열을 반환한다. 주로 이것은 for-each
문과 함께 사용되며, enum
타입의 모든 값을 반복문을 돌며 반환한다.
enum
자체가 클래스이기 때문에 내부에 생성자, 필드, 메서드를 가질 수 있다. enum
상수는 필드나 생성자보다 먼저, 맨 처음에 선언되어야 하고 후에 필드나 생성자가 따라오면 꼭 세미콜론으로 마쳐야 한다.
enum Animal {
TIGGER("육식"), ZIBRA("초식"), SQUIRREL("잡식"); // enum Contstant
private final String eating; // 클래스 필드
Animal(String eating) { // 생성자 : 외부에서 직접 호출할 수는 없다.
this.eating = eating;
}
String getEating() {
return this.eating;
}
}
for (Animal a : Animal.values()) {
logger.debug("줄무늬가 있는 동물은 {}이다.", a);
logger.debug(" --- 그 동물은 {}이다.", a.getEating());
/*
줄무늬가 있는 동물은 TIGGER이다.
--- 그 동물은 육식이다.
줄무늬가 있는 동물은 ZIBRA이다.
--- 그 동물은 초식이다.
줄무늬가 있는 동물은 SQUIRREL이다.
--- 그 동물은 잡식이다.
* */
}