자바(Java)
Java Enum class 제대로 사용하기.
SSaMKJ
2016. 11. 25. 16:28
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 처럼) 여러 곳에서 사용하게 된다면 변경을 하거나 데이터를 추가 할 때 마다 사용되는 모든 코드를 점검하고 테스트를 해야 한다. 그런데도 버그가 나타난다. 결국 객체지향적인 코드가 아닌 절차지향적인 코드를 생성해서 스파게티 소스가 되는 것이다.