2013년 3월 10일 일요일

Java enum Type

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으로 변환하여 사용할 수 있다.
저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

댓글 없음:

댓글 쓰기