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 타입으로 표시되어 있어서 문자열로 직접 기입하고 적용하고 싶었을 것이다.