본문 바로가기

Programming/Java

Java 버전 1.5 부터 소개된 enum 에 대해서

오늘은 Java 버전 1.5 부터 소개된 enum type 에 대해서 알아보자.


enumerated type 인 enum 은 Java SE 버전 1.5 부터 생긴 type 으로서 정수형 상수들을 대체하기에 적당한 기능들을 제공한다.


그래서 아래와 같은 상황에서 enum type 의 사용을 고려 해보는 것이 좋다.


Effective Java 2nd edition 에서는 int enum pattern 이라는 형식일 때, enum type 의 사용을 고려해 보라는 내용이 나온다.


예를 들어서 아래와 같은 코드가 있다고 하면, 아래의 코드는 int enum pattern 이라고 부른다.

 public static final int WEEK_MON = 0;

 public static final int WEEK_TUE = 1;

 public static final int WEEK_WED = 2;

 public static final int WEEK_THU = 3;

 public static final int WEEK_FRI = 4;

 public static final int WEEK_SAT = 5;

 public static final int WEEK_SUN = 6;


이럴 경우, 또 다시 아래와 같은 코드가 있다고 하면,

  public static final int TIME_AM = 0;

  public static final int TIME_PM  = 1;


조금 과장된 표현일 수도 있지만, 아래와 같은 상황이 발생할 수 있다. 이러한 상황에서는 컴파일러는 아무런 경고 메시지도 출력하지 않는다.

 if (WEEK_MON == TIME_AM) { System.out.println("Same time"); }


이러한 상황은 우리가 원하는 것이 아니다. 하지만 이러한 코드는 컴파일러가 잘못 된 표현이라고 알려주지 않는다. 이러한 도움을 받고 싶을 경우에는 enum type 을 사용하면 간단하게 해결 된다. 위의 일주일에 관한 int enum pattern 을 enum type 으로 수정하면, 아래와 같이 코드를 작성할 수 있다.

 public enum WEEK {MON, TUE, WED, THU, FRI, SAT, SUN}

 public enum TIME {AM, PM}


그리고 아래와 같이 코드를 작성하게 되면, 컴파일 에러가 발생한다. WEEK.MON 과 TIME.AM 은 서로 비교할 수 없다고 컴파일러가 컴파일 타임에 친절하게 알려준다. 

 if (WEEK.MON == TIME.AM) {System.out.println("Same!");}


이렇게 int enum patter 이 나타나는 경우에는 enum type 을 사용하면 코드의 잠재적인 버그를 줄일 수 있는 정확한 프로그램을 작성할 수 있다. 아울러 한가지 장점이 더 있는데, int enum pattern 이 사용될 경우 정수값에 해당하는 변수의 이름을 출력하기가 어렵다. (i.e. WEEK_MON 의 값 자체는 출력이 되지만 이 변수의 이름을 출력하려면 상당의 코드를 작성할 필요가 있다.)

이러할 경우에도 enum type 을 사용하면 간단하게 해결이 된다. 그냥 아래와 같이 사용하면 된다. 출력내용은 "MON" 이라고 나온다.

 System.out.println(WEEK.MON)


결론은, int enum pattern 이 나올 경우, 프로그램의 잠재적인 버그를 만들지 않을 수 있고, 디버깅에도 용이한 이점을 얻을 수 있는  enum type 의 사용을 고려해 보자. :)