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 처럼) 여러 곳에서 사용하게 된다면 변경을 하거나 데이터를 추가 할 때 마다 사용되는 모든 코드를 점검하고 테스트를 해야 한다. 그런데도 버그가 나타난다. 결국 객체지향적인 코드가 아닌 절차지향적인 코드를 생성해서 스파게티 소스가 되는 것이다.
'자바(Java)' 카테고리의 다른 글
| 리펙토링 원칙 (0) | 2017.10.29 |
|---|---|
| Web service architecture 에 관하여. (14) | 2017.02.05 |
| G1 가비지 콜렉터 이전과 다른 점 & 동작 방식 (12) | 2016.09.30 |
| Java String 압축 클래스. (2) | 2015.12.07 |
| Java | AES-256 암호화 오류 해결 방법. JDK8 파일 첨부. (57) | 2015.10.22 |
댓글