시소당
Typesafe Enums를 굳이 번역하자면 "타입 안전 열거형" 정도가 되겠다. 타입 안전 열거형은 말 그대로 열거형 타입을 제공하는 것이다. 이전까지 자바에서는 열거방식을 주로 상수를 정의해서 구현했었다.
public interface Num {
public static final int ZERO = 0;
public static final int ONE = 1;
public static final int TWO = 2;
....
}
// Number Interface 사용
......
int num;
...
if( num == Num.ZERO ) {
...
}
하지만 위의 방식은 타입에 안전하지 않은데, 타입에 안전하지 않다는 것은 다음과 같음을 말한다.
public interface Language {
public static final int JAVA = 0;
public static final int CPP = 1;
public static final int PERL = 2;
....
}
// Number Interface 사용
......
int lan;
...
if( lan == Num.ZERO ){ // equals mean, lan == Language.JAVA
...
}
위 코드의 비교문에는 Num.ZERO가 아닌 Language.JAVA가 와야 의미상 맞지만, 프로그램적으로는 문제가 없으며, 컴파일시에도 역시 에러가 발생하지 않는다.
즉, 타입에 안전하지 않다는 것은 위와 같이 상수를 이용한 열거형에서는 상수 값만 같으면 사실상 열거 타입의 구분이 의미가 없어짐을 의미한다. 그렇다고 타입에 안전한 레퍼런스 타입을 활용하게 되면, switch ~ case 문에서 사용할 수 없다는 단점이 있다. 이런 문제를 해결하기 위해서 자바 1.5에서는 enum 타입을 제공하기 시작했다.
class Test
{
public enum Num { ZERO, ONE, TWO };
public static void main(String[] args)
{
Num num = Num.ONE;
switch( num ){
case ZERO:
System.out.println("0"); break;
case ONE:
System.out.println("1"); break;
case TWO:
System.out.println("2"); break;
default:
break;
}
}
}
열거 타입 그 자체가 타입이기 때문에, 열거 타입에 없는 값을 할당하게 되면 컴파일 에러가 발생하게 된다.