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