App Programming/JAVA2007. 7. 6. 17:11
출처:
http://arysu.egloos.com/1478079




Enum... 열거체라고 한다.
C를 해본 사람은 본적이 있을 것이다.

이번 Java 5.0 Tiger에도 생겼다.
아래와 같이 쓴다.

public enum SubwayLine {
    LINE_NO1, LINE_NO2, LINE_NO3, LINE_NO4, LINE_NO5, LINE_NO6, LINE_NO7, LINE_NO8, BUNDANG_LINE
}

열거체의 특징은 다음과 같다.

1. 클래스이다. 열거체는 클래스이다. 따러서 클래스의 모든 특징을 가진다.
2. java.lang.Enum 클래스를 extends 한다.
3. 열거타입들은 정수형이 아니다.
4. public 생성자를 가지지 않는다.
5. 열거된 값은 public이며, static이고, final이다. public static final... 즉, 상수이다.
6. 열거된 값의 비교는 '=='와 'equals()' 모두 사용 가능 하다.
7. java.lang.Comparable을 Implements한다. 따라서 열거된 값들은 compareTo()로 비교할 수 있다.
8. toString()을 오버라이드 한다.final이 아니라서 다시 오버라이드 할 수도 있다.
9. static valueOf() 메소드를 제공한다.
10. final 인스턴스 메소드인 ordinal()을 정의하고 있다. 이는 열거된 값들의 포지션(인덱스 0부터 시작하는 정수타입)을 반환한다.
11. values() 메소드를 정의한다.

아래 코드를 테스트 해 보기 바란다.

SubwayLine[] subwayLines = SubwayLine.values();
for (int i = 0; i < subwayLines.length; i++) {
    System.out.println("===> ["subwayLines[i].ordinal()+"]" + subwayLines[i].toString() + "(" + Enum.valueOf(SubwayLine.class, subwayLines[i].toString()) + ")");;
}

열거체는 switch문에서 다음과 같이 사용 가능하다.

SubwayLine line = ...;
switch (line) {
    case SubwayLine.LINE_NO1:
        break;
    case SubwayLine.BUNDANG_LINE:
        break;
    defalut:
        break;
}

다음과 같이도 가능하다.
SubwayLine line = ...;
switch (line) {
    case 0:
        break;
    case 8:
        break;
    defalut:
        break;
}

0, 8은 ordinal()에서 리턴하는 값이다.


열거체를 위한 Map인 java.util.EnumMap과 Set인 java.util.EnumSet이 존재한다.
여기에 대해서는 다음에 한 번 사용해 보겠다. (-_-"))))... 역쉬 귀차니즘...


열거체는 클래스이므로 생성자와 메소드 추가도 가능하다. 단 생성자는 public일 수 없다.
그리고 인터페이스 구현은 가능하다. 하지만 클래스 상속은 안된다. 당연하지 않은가? 이미 Enum 클래스를 상속하고 있고, Java에서 다중상속은 허용되지 않는다!!!
또한 열거체를 상속하여 또 다른 열거체를 만들 수도 없다.



과연 상수는 해당 VO나 DTO에 있는 것이 맞는가?
아니면 Interface에 있는 것이 맞는가?
그냥 Const Interface를 만드는 것이 맞는가?

고민 많이 했었다.
결국 Enum으로 이 고민은 해결될 것 같다.
장담은 못한다. 아직 제대로 써보진 않았으니까~ (-_-;;)



Posted by BAGE