Java Eunm 유사 클래스 사용해보기1
다음 코드를 Enum 선언하고 해보도록 한다.
Grade.class
public class Grade {
public static final Grade BRONZE = new Grade();
public static final Grade SILVER = new Grade();
public static final Grade GOLD = new Grade();
private Grade() {}
}
DiscountService.class
public class DiscountService {
public int discount(Grade grade, int price) {
int discountPercent = 0;
if (grade == Grade.BRONZE) {
discountPercent = 10;
} else if (grade == Grade.SILVER) {
discountPercent = 20;
} else if (grade == Grade.GOLD) {
discountPercent = 30;
} else {
System.out.println("할인 없음");
}
return discountPercent * price / 100;
}
}
- discount() 메소드 내부 if 문 제고해보기
- discountPercent 회원 등급에 따라 차별 할인이 있다. 10, 20, 30 각각 할당하고 있는데 관리형태로 바꾼다.
Grade 클래스 리팩토링
코드에서 discountPercent 관리하는 코드를 추가한다.
Grade.class
public class Grade {
public static final Grade BRONZE = new Grade(10);
public static final Grade SILVER = new Grade(20);
public static final Grade GOLD = new Grade(30);
private final int discountPercent;
private Grade(int discountPercent) {
this.discountPercent = discountPercent;
}
public int getDiscountPercent() {
return discountPercent;
}
}
- Grade 에서 할인율(discountPercent) 필드 추가하고 getter 메소드도 만들어준다.
- 생성자 통해서만 discountPercent 설정하여 값이 변하지 않도록 불변한다.
- 상수 정의 따라 등급 할인율이 정해진다.
DiscountService.class
public class DiscountService {
public int discount(Grade grade, int price) {
return grade.getDiscountPercent() * price / 100;
}
}
- 불필요한 if문을 제거하였다.
Main.class
public class Main {
public static void main(String[] args) throws Exception {
// 모든 ENUM 반환하기
int price = 10000;
DiscountService dc = new DiscountService();
System.out.println(dc.discount(Grade.BRONZE, price));
System.out.println(dc.discount(Grade.SILVER, price));
System.out.println(dc.discount(Grade.GOLD, price));
}
}
1000
2000
3000
호출부에서도 문제없이 호출할 수 있다.