Java Enum - 타입 안전성 도입

Enum 도입 이전에 대안으로 문자열 상수로 사용하였다.
상수는 미리 정의된 변수 사용으로 문자열 직접 사용보다 안전하였다.


실습

StringGrade.class

public class StringGrade {
    public static final String BRONZE = "BRONZE";
    public static final String SILVER = "SILVER";
    public static final String GOLD = "GOLD";
}

DiscountService.class

public class DiscountService {
    public int discount(String grade, int price) {

        int discountPercent = 0;
        switch (grade) {
            case StringGrade.BRONZE:
                discountPercent = 10;
                break;
            case StringGrade.SILVER:
                discountPercent = 20;
                break;
            case StringGrade.GOLD:
                discountPercent = 30;
                break;
        }

        return price * discountPercent / 100;
    }
}

Main.class

public class Main {
    public static void main(String[] args) throws Exception {
        int price = 10000;

        DiscountService disSrv = new DiscountService();

        System.out.println(disSrv.discount(StringGrade.BRONZE, price));
        System.out.println(disSrv.discount(StringGrade.SILVER, price));
        System.out.println(disSrv.discount(StringGrade.GOLD, price));
    }
}

호출부에서 쿠폰 등급 오타가 발생하여도 문제 없이 동작하는 것을 볼 수 있다.
코드도 명확하고 StringGrade 쿠폰 등급에 문자열 상수로 사용해 타입이 안전하다.
무엇보다 오타나 대소문자 오타가 발생하여도 컴파일 시점에서 오류가 발생한다고 명확히 인지 시켜준다.

그렇지만 StringGrade 사용하지 않고 누군가 문자열로 다이렉트로 기입할 수 있다.

System.out.println(disSrv.discount(StringGrade.BRONZE, price));
System.out.println(disSrv.discount(StringGrade.SILVER, price));
System.out.println(disSrv.discount(StringGrade.GOLD, price));
System.out.println(disSrv.discount("VIP", price));

이 개발자는 VIP 신규 쿠폰을 만드는 요구사항을 받았고 discount 메소드를 봤더니 인자를 String 타입으로 표시되어 있어서 문자열로 직접 기입하고 적용하고 싶었을 것이다.