from Dictionary - Enumeration

Enumeration

JAVA에서 enum은 interface와 같이 독립된 특수한 클래스로 구분된다. 즉, 일종의 객체이기 때문에 heap에 저장되며, 각 enum 상수들은 별개의 메모리 주소 값을 가짐으로써 완벽히 독립된 상수를 구성할 수 있다.

장점

  • 코드가 단순해지며 가독성이 좋아진다
  • 허용 가능한 값들을 제한하여 유형 안전(type safe)을 제공한다.
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
  • 자체 클래스 상수와 달리 switch문에서도 사용할 수 있다
  • 단순 상수와 비교해 IDE의 적극적인 지원을 받을 수 있다 (자동완성, 오타검증, 텍스트 리팩토링 등등)
  • 리팩토링시 변경 범위가 최소화 된다 (enum에서 한번에 관리하기 때문에 내용의 추가가 필요하더라도, Enum 코드외에 수정할 필요가 없다)
  • enum은 본질적으로 Thread safe인 싱글톤 객체 이므로 싱글톤 클래스를 생성하는데에도 사용된다

메소드

|메소드| 설명 |리턴 타입| |:—–:|:——–:|:———–:| |name()|열거 객체의 문자열을 리턴|String| |ordinal()|열거 객체의 순번(0부터 시작)을 리턴|int| |compareTo()|열거 객체를 비교해서 순번 차이를 리턴|int| |valueOf(String name)|문자열을 입력받아서 일치하는 열거 객체를 리턴|enum| |values()|모든 열거 객체들을 배열로 리턴|enum[]|

java.lang.Enum

모든 클래스가 Object 클래스를 자동 상속하는 것 처럼, Enum 클래스도 무조건 java.lang.Enum 이라는 클래스의 상속을 받는다. 그리고 java.lang.Enum 클래스에 정의되어 있는 메소드를 가져와 사용하는 것이다

메소드 내용
clone() 객체를 복제하기 위한 메소드
하지만, 이 메소드는 enum 클래스에서 사용하면 안된다.
만약 호출될 경우엔 CloneNotSupportedException 이라는 예외를 발생시키도록 되어있다
finalize() GC가 발생할 때 처리하기 위한 메소드
hashCode() int 타입의 해시 코드 값을 리턴하는 메소드
equals() 두 개의 객체가 동일한지를 확인하는 메소드

Enum, Singleton

자바에서의 enum 열거 타입은 일종의 클래스이며 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개하게 된다. 하지만 enum은 클래스처럼 이용할수는 있지만 인스턴스화는 할수는 없는데, 실제로 new 키워드로 인스턴스 생성을 하려고 하면 에러가 난다. 이러한 제약적인 특징을 가지고 있는 이유는 enum 타입은 고정된 상수들의 집합으로써, 런타임(run-time)이 아닌 컴파일타임(compile-time)에 모든 값을 알고 있어야 하는 규칙이 있기 때문이다. 즉, 다른 패키지나 클래스에서 enum 타입에 접근해서 변수 처럼 동적으로 어떠한 값들을 할당해 주는 행위는 금지된 것이다. 이 때문에 enum 객체의 생성자의 접근제어자를 private으로 설정해야 한다. 이렇게 되면 외부에서 접근 가능한 생성자가 없으므로 enum타입은 실제적으로 final 클래스와 다름이 없게 된다. 이러한 특성 때문에, enum타입은 싱글톤을 구현하는 하나의 방법으로 사용되기도 한다.