Java Enum class 제대로 사용하기


Java에서 


public static final int CUSTOMER_NORMAL = 1000;

public static final int CUSTOMER_SILVER = 1001;


형식으로 되어 있는 코딩을 많이 볼 수 있다.

그런데, 만약 CUSTOMER_* 상수가 숫자 이상의 데이터를 표현하고 싶으면 어떻게 하지?

보통은 이렇게 한다.

private String getCustomerGradeName(int gradeCode)
{
    switch (gradeCode)
    {
        case CUSTOMER_NORMAL : 
            return "일반회원";
        case CUSTOMER_SILVER :
            return "실버회원";
    }
    return null;
}

문제는 만약 저 상수를 사용하는 곳이 많다면 문제가 생긴다.

고객 등급이 하나가 추가 될 때 마다 사용하는 곳을 찾아서 변경해주어야 한다.

하지만 enum 을 사용한다면??


enum CUSTOMER_GRADE
{
    NORMAL(1000, "일반회원"),
    SILVER(1001, "실버회원");

    private final int grade;
    private final String name;

    CUSTOMER_GRADE(int grade, String name)
    {
        this.grade = grade;
        this.name = name;
    }

    public int getGrade()
    {
        return grade;
    }

    public String getName()
    {
        return name;
    }
}


아래와 같은 코드를 만들 수 있고, 등급이 추가된다고 하여도 문제가 생기지 않는다.


private String getCustomerGradeName2(int gradeCode)
{
    for (CUSTOMER_GRADE grade : CUSTOMER_GRADE.values())
    {
        if (grade.getGrade() == gradeCode)
        {
            return grade.getName();
        }
    }
    return null;
}


위 코드를 직접 enum 클래스에 넣어도 된다.

아래의 코드가 가장 좋다.

코더가 다른 클래스를 사용 할 때는 내부 구조가 어떤지를 알 필요가 없기 때문이다.


enum CUSTOMER_GRADE
{
    NORMAL(1000, "일반회원"),
    SILVER(1001, "실버회원");

    private final int grade;
    private final String name;

    CUSTOMER_GRADE(int grade, String name)
    {
        this.grade = grade;
        this.name = name;
    }

    public int getGrade()
    {
        return grade;
    }

    public String getName()
    {
        return name;
    }

    public static String getName(int gradeCode){
        for (CUSTOMER_GRADE grade : CUSTOMER_GRADE.values())
        {
            if (grade.getGrade() == gradeCode)
            {
                return grade.getName();
            }
        }
        return null;
    }
}


그렇다면 호출했던 곳은 이렇게 바뀐다. 


private String getCustomerGradeName3(int gradeCode)
{
    return CUSTOMER_GRADE.getName(gradeCode);
}


enum 클래스를 활용할 수 있는 방법이 매우 많은데, 많이 쓰여지지 않는 점이 매우 아쉽다.

결국 코딩의 양이 많아졌다?

만약 한 곳에서만 사용하고 재사용이 절대 없을 것이라고 장담한다면 물론 그냥 일반적인 public static final 상수로 만들어서 사용해도 된다.

한 번 만들고 버려질 소스라면 상관 없다.

그냥 상수로 만들었는데, 생각지도 못한 인기를 얻어(인기 아이돌보다 더 많이 검색되는 박OO과 최OO 처럼) 여러 곳에서 사용하게 된다면 변경을 하거나 데이터를 추가 할 때 마다 사용되는 모든 코드를 점검하고 테스트를 해야 한다. 그런데도 버그가 나타난다. 결국 객체지향적인 코드가 아닌 절차지향적인 코드를 생성해서 스파게티 소스가 되는 것이다.


+ Recent posts