Java Enum - 타입 안전성이 필요한 이유
자바가 제공하는 기능 중 Enum Type 이 있다. 열거형이 부르며 왜 생겨났는지 살펴보고 열거형이 필요한 이유를 알아본다.
쿠폰 발급 요구사항
장바구니에 담긴 상품들을 집계하여 총 가격이 나타난다.
여기서 기획된 쿠폰을 사용하면 할인이 되는 시스템이 있다고 가정한다.
- Bronze 등급은 10퍼 할인
- Silver 등급은 20퍼 할인
- Gold 등급은 30퍼 할인
총 바구니에 담긴 상품의 총합은 10,000 가정하였을 때 쿠폰 등급에 따라 할인 금액은 다음과 같다
- Bronze -> 1000
- Silver -> 2000
- Gold -> 3000
DiscountService.class
public class DiscountService {
public int discount(String grade, int price) {
int discountPercent = 0;
switch (grade) {
case "Bronze":
discountPercent = 10;
break;
case "Silver":
discountPercent = 20;
break;
case "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("Bronze", price));
System.out.println(disSrv.discount("Silver", price));
System.out.println(disSrv.discount("Gold", price));
}
}
1000
2000
3000
코드는 등급 별 할인 금액이 표시한다.
메인 코드로 "Bronze", "Silver", "Gold" 등 문자열로 직접 기입하고 있다. 이 경우 오타가 발생할 확률이 높고 오타로 인한 오류 확인도 즉시 확인하기 어렵다.
System.out.println(disSrv.discount("Sllver", price));
Silver -> Sllver 로 오타가 발생하여도 자바는 실행된다. 그리고 자바는 대 소문자 구분하지도 않으므로 주의해야한다.
또는 할인금액에 추가되지 않는 새로운 쿠폰이 나온 경우 구현되었는지 잊은 호출을 시도한 경우
System.out.println(disSrv.discount("VIP", price));
마찬가지로 없는 쿠폰인데도 자바는 문제 없다고 판단하고 실행한다.
쿠폰 문제 발생
- 존재하지 않는 쿠폰 입력
- 문자열로 인한 오타
- 문자열로 인한 대소문자 구분 주의
이는 쿠폰 문자열의 다음과 같은 문제로 발생하고 있다.
쿠폰에서 발생된 언어의 원인
- 타입 안정성 부족
- 문자열 오타가 쉽고 유효하지 않은 값 기입함
- 데이터 일관성 부족
- Gold, gold, GOLD 다양한 문자열을 입력할 수 있으므로 일관되지 않음
String 타입 안정성 부족
- 값에 의한 제한 없음 또는 부족함
- String 상태 또는 카테고리 표현 시 잘못된 문자열로 실수할 여지가 있다.
"Monday" 문자열이 "Munday" 기입될 수 있고 "Friday"Firday" 입력될 위기가 있다.
- String 상태 또는 카테고리 표현 시 잘못된 문자열로 실수할 여지가 있다.
- 컴파일 시 오류 감지되지 않음
- 컴파일에서도 문자열을 감지 하지 않는다. 잘못된 입력이 기입해도 파악하는데 시간이 필요해 디버깅이 미뤄질 수 있다.