본문 바로가기

Java

java Enum 정리


Enum 열거형.

가장 간단히 enum을 정의 하는 법

enum EnumName { EnumValule1, EnumValue2, ... }

EnumValue의 젤 뒤에 세미콜론을 넣어도 오케이

enum EnumName { EnumValule1, EnumValue2, ...;}

EnumValue의 젤뒤에 컴마랑 세미콜론을 넣어도 오케이(생긴건 약간 이상함)

enum EnumName { EnumValule1, EnumValue2, ...,;}

EX)
enum Gender {MALE, FEMALE}
enum Status {STAT1, STAT2, STAT3;}
enum 종족 {
휴먼,
엘프,
드워프,
호빗,
}

사용법

enum에 정의된 EnumValue는 정수(public static final) 처럼 취급

Status s = Status.STAT1;
if( s == Status.STAT1) {
 
} else if (s == Status.STAT2){

}

스위치문에서 사용가능

Statis s = Status.STAT1;
switch(s) {
  case STAT1: blah....; break;
  case STAT2: blah....; break;
  default : default blah...; break;
}

위에서 switch문에 들어가는 값이 null로 나오면 NullPoihnterException이 발생하니 주의!

암묵적으로 정의되는 메서드
아래와 같은 enum을 정의했다고 치자
enum Status {STAT1, STAT2, STAT3}

컴파일 된 이미지는 아래와 같다. (JVM에 따라 약간의 차이가 생김)

final class Status extends Enum<Status> {
  private Status(String name, int ordinal) {
     super(name, ordinal);
  }
  public static final Status STAT1 = new Status("STAT1", 0);
  public static final Status STAT2 = new Status("STAT2", 0);
  public static final Status STAT3 = new Status("STAT3", 0);
 
  private static final Status ENUM$VALUES[] = {STAT1, STAT2, STAT3};
}

ENUM$VALUES에 모든 열거자(EnumValue)가 저장이 되는데, 이것을 사용하고자하면 values()를 사용하면 된다.

 public final String  name()  열거자의 이름을반환  String name = STAT1.name();
 public final  int ordinal() 열거자의 순서를 반환(컴파일러가 임의로 지정함)  int n = STAT1.ordinal();
 public final int compareTo(열거자) 순서에 의해 대소비교  Status s = ...;
if (s.compareTo(STAT2) < ) {...}
 public  String toString() name()과동일, 오버라이드 가능   System.out.println(STAT1);
public static   Enum valueOf(String name) 문자열에 해당하는 열거자의 오브젝트를 반환. 없으면 익셉션 발생  Status s = Status.valueOf("STAT1");
public static  Enum[] values() 열거자를 순서대로 나열한 배열을 반환.
ENUM$VALUES의 카피이므로, 너무 자주 호출하는것은 좋지않음.
 Status[] sarr = Status.values();
 public final   Class<Enum> getDeclaringClass()  열거자의 클라스를 취득함.  Class clazz = STAT1.getDeclaringClass();

enum의 언어상의 특수취급사항

1. enum은 new로 새로운 인스턴스를 만들수 없다. 생성자가 private이므로
2. newInstance() 리플리케이션에 의한 인스턴스생성도 불가. newInstance()를 호출하면 InstantiationException 발생.
3. clone()을 만들수 없다. Enum클래스를 상속받고는 있지만, clone() 메서드가 final로 지정이 되어있어서 사용하게되면 CloneNotSupportedException 발생.
4. 시리얼라이즈 - 외부에서 출력하여 다시읽어들여도, 올바르게 열거자가 됨.
  (설명) 열거자의 증감이 있어서(클래스가 수정되어서) ordinal값이 변경되어도 올바른 이름의 열거자가 된다.  열거자가 없는 경우는 InvalidObjectException(enum constant 열거자 does not exist)가 발생함.
 
그외

enum은 [특수한 클래스]이므로 아래와 같은 코딩이 가능함.

public enum Main{
  ;
  public static void main(String [] args){
    System.out.println("이렇게해도 실행이 된답니다~~~^^;");
  }
}


위 내용은 아래의 일본사이트에서 번역해서 가져 왔습니다.
발번역이라 이상한부분도 많을것 같아요ㅠㅠ
http://www.ne.jp/asahi/hishidama/home/tech/java/enum.html

다른 내용이 더 있긴한데 정리한거만 알아도 사용하는데 지장이 없을것 같습니다.

설명이 부족한 부분이 있다면 댓글로 남겨주시면 찾아보겠습니다.