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" 입력될 위기가 있다.
  • 컴파일 시 오류 감지되지 않음
    • 컴파일에서도 문자열을 감지 하지 않는다. 잘못된 입력이 기입해도 파악하는데 시간이 필요해 디버깅이 미뤄질 수 있다.