Search Results for 'Typesafe enum pattern'


1 POSTS

  1. 2008/07/30 열거형 데이터의 처리 by 정샘

열거형 데이터의 처리

Java SE 5.0부터 소개된 enum 을 사용하기 이전의 코드는 열거형 데이터를 구현하기 위해 다음과 같은 방법을 써왔다.

// 정수 타입의 열거형 패턴 이용
package exam.enums;

// 자바 1.5 이전 형식의 코드를 사용한 요일 표현
public class Aweekday {
public static final int SUNDAY = 0;
public static final int MUNDAY = 1;
public static final int TUESDAY = 2;
public static final int WEDNESDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
public static final int SATURDAY = 6;
}
// 4계절을 표현
public class Season {
public static final int SPRING = 0;
public static final int SUMMER = 1;
public static final int FALL = 2;
public static final int WINTER = 3;
}

통상적으로 열거형은 정수타입의 순서값을 가지고 있는 것으로 취급된다. 하지만 위의 두 클래스를 이용하여 코딩을 하면 다음과 같은 문제를 만난다.

//
...
if (season == Aweekday.SUNDAY) {
...
} else if (season == Season.SPRING) {
...
}

계절을 나타나내는 데이터와 요일을 나타내는 데이터는 결국 모두 int 타입의 정수값이기 때문에 다른 정수값과 구별이 되지 않는다. (Not typesafe) 그리고 또다른 계절이나 요일을 나타내는 열거형이 존재할 경우 서로 구별할 방법이 없다. (No namespace)

// 두 나라의 계절 표시
...
public static final int KR_SPRING = 0;
public static final int KR_SUMMER = 1;
public static final int KR_FALL = 2;
public static final int KR_WINTER = 3;
public static final int JP_SPRING = 4;
public static final int JP_SUMMER = 5;
...

그리고 위의 코드로 작성된 열거형 데이터들은 컴파일시에 값이 결정되기 때문에 두 값 사이에 새로운 값을 추가해야 하는 경우나 순서를 바꿔야 하는 경우 다시 컴파일을 해야한다. (Brittleness) 마지막으로 열거 데이터는 모두 정수값이므로 정보를 표현하거나 데이터 타입을 별도로 표시하는 것도 불가능하다. (Printed values are uninformative)
이런 문제점을 해결하기 위해 다음과 같이 typesafe enum pattern을 이용한다.

// Typesafe enum pattern을 사용한 계절 표현
public class Season {
private final String name;

public static final Season SPRING = new Season("SPRING");
public static final Season SUMMER = new Season("SUMMER");
public static final Season AUTUMN = new Season("AUTUMN");
public static final Season WINTER = new Season("WINTER");

private Season(String name) {
this.name = name;
}

public String toString() {
return name;
}
}

여기서 눈여겨 볼 점은 생성자가 private로 선언되었다는 점이다. 생성자가 private로 선언되었다는 것은 하위 클래스에서 영향을 줄 수 없다는 얘기이다. 상수들은 접근하기 쉽도록 static으로 선언되었다.
이렇게 선언된 열거형 객체인 Season의 인스턴스는 다음과 같이 사용할 수 있다.


...
System.out.println(Season.SUMMER);
...
if (season == Season.SPRING) {
...
} else if (season == Season.SUMMER) {
...
}
...

이제 이 소스를 확장하여 순서의 개념을 추가해보록 하겠다.
// 순서 개념이 들어간 계절 표현
public class Season implements Comparable {
private final String name;

public static final Season SPRING = new Season("SPRING");
public static final Season SUMMER = new Season("SUMMER");
public static final Season AUTUMN = new Season("AUTUMN");
public static final Season WINTER = new Season("WINTER");

// 생성될 다음 Season의 순서
private static int nextOrdinal = 0;

// 현재 Season의 순서 할당
private final int ordinal = nextOrdinal++;

private Season(String name) {
this.name = name;
}

public String toString() {
return name;
}

public int compareTo(Object o) {
return ordinal - ((Season)o).ordinal;
}
}

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/07/30 16:09 2008/07/30 16:09
, ,
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/8