[java] 열거형 enum

Published: by Creative Commons Licence

참고

Java tutorial : Classes and Objects-Enum Types
생활코딩 - enum

열거형 enum (enumerated type)

enum 타입은 특별한 데이터 타입으로 미리 정의되고 고정된 상수 집합이다. 자바 5 이상 사용 가능 enumclass, 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.Enumenum의 부모이다. 자바의 다중 상속을 지원 하지 않는 특성 상, 클래스는 하나의 부모만 확장할 수 있고 그로 인해 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이다.
    --- 그 동물은 잡식이다.
   * */
}