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 |
댓글