레이블이 string to enum인 게시물을 표시합니다. 모든 게시물 표시
레이블이 string to enum인 게시물을 표시합니다. 모든 게시물 표시

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