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

호출부에서도 문제없이 호출할 수 있다.