Enumeration Type
이뉴머레이션 타입. 우리나라 말로 열거형이다. C++로 작업할 때 많이 사용했었는데 다음과 같은 장점이 있다.
의미 있는 값 표시
#define
을 이용하면 정의된 값으로 치환되기 때문에 디버깅할 때 힘들다.
이 때 enum을 이용하면, 정수로 변환되어 사용되긴 하지만 enum에서 정의한 단어 즉, 의미있는 단어가 그대로 나오기 때문에 직관적으로 알 수 있다.
형태에 안전한 코드
형태에 안전하도록 제약조건을 둘 수 있다. 어떤 함수(내지는 메소드)를
someFunc(int valueType)
와 같이 정의했는데 인수로 들어가는 값이
0: Unknown, 1: String, 2: Number, 3: DateTime 이라고 해 보자. 인수를 정수형태로 받기 때문에 0 ~ 3 이외의 값을 입력받을 수 있다. 5가 입력되면 어떻게 처리한단 말인가...
자~ 다음과 같이 enum 타입을 정의하고
enum ValueType { eUnknown = 0 , eString = 1 , eNnumber = 2 , eDateTime = 3 ; }
someFunc(ValueType valueType)
으로 정의하면 받을 수 있는 인수값이 enum에 정의한 값으로 제한된다. 즉, 형태와 값에 안전한 코드를 생성할 수 있다.
enum in Java
지금까지는 C++ 얘기였고, Java 얘기를 해보자.
JDK 1.5부터 enum 형태를 지원하기 시작했단다. Java의 enum도 C++에서와 마찬가지 효과를 얻을 수 있으며, 정의는 다음과 같이 한다.
public enum ValueType { Unknown , String , Number , DateTime };
C++와 비슷하다... 여기서 끝나면 뭔가 허전하다. 뭔가 조금이라도 좋아진 것이 있을텐데... 그렇다. Java의 enum은 값을 정수 이외의 다른 형태의 값도 가질 수 있다. 즉, 다음과 같이 정의할 수 있다.
public enum ValueType { Unknown("unknown") , Text("string") , Integer("integer") , Real("real") , DateTime("datetime") ; private String _description; private ValueType(String description) { this._description = description; } public String getDescription() { return this._description; } }
ValueType.Text.getDescription()
와 같이 하면 지정된 enum 값에 할당된 값을 얻을 수 있다.
값을 가져올 수 있으면 값에서 enum 정의를 가져 올 수도 있을 것이다.
public enum ValueType { Unknown("unknown") , Text("string") , Integer("integer") , Real("real") , DateTime("datetime") ; private String _description; private ValueType(String description) { this._description = description; } public String getDescription() { return this._description; } public static ValueType getTypeFromString(String description) { for(ValueType valueType : ValueType.values()) { if( description.equalsIgnoreCase(valueType._description) ) return valueType; } return Unknown; } }
위와 같이 정의된
getTypeFromString()
을 이용하면,
설정파일에서 값을 읽어 바로 enum으로 변환하여 사용할 수 있다.