타입 안전 열거형 패턴

SungMin·2026년 5월 28일

자바 심화 정리

목록 보기
17/34

지금까지 설명한 문제를 해결하기 위해서 타입 안정 열거형 패턴이다.
타입 안정 열거형 패턴을 사용하면 나열한 항목만 사용 할 수 있다는 점이 특징이다.


package enumeration.ex2;

public class ClassGrade {
    public static final ClassGrade BASIC = new ClassGrade();
    public static final ClassGrade GOLD = new ClassGrade();
    public static final ClassGrade DIAMOND = new ClassGrade();

    // private 생성자 추가
    private ClassGrade() {

    }
}
  • 각각 상수마다 별도의 인스턴스를 생성하고, 생성한 인스턴스를 대입한다.
  • 상수로 선언하기 위해 static, final을 사용하였다.
package enumeration.ex2;

public class DiscountService {
    public int discount(ClassGrade classGrade, int price) {
        int discountPercent = 0;

        if (classGrade == ClassGrade.BASIC) {
            discountPercent = 10;
        } else if (classGrade == ClassGrade.GOLD) {
            discountPercent = 20;
        } else if (classGrade == ClassGrade.DIAMOND) {
            discountPercent = 30;
        } else {
            System.out.println("할인X");
        }



        return price * discountPercent / 100;
    }
}


package enumeration.ex2;

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

        DiscountService discountService = new DiscountService();
        int basic = discountService.discount(ClassGrade.BASIC, price);
        int gold = discountService.discount(ClassGrade.GOLD, price);
        int diamond = discountService.discount(ClassGrade.DIAMOND, price);

        System.out.println("BASIC 등급의 할인액: " + basic);
        System.out.println("GOLD 등급의 할인액: " + gold);
        System.out.println("DIAMOND 등급의 할인액: " + diamond);
    }
}

그런데 이 방식은 외부에서 임의로 ClassGrade의 인스턴스를 생성할 수도 있다.
이 문제를 해결하기 위해 ClassGrade를 생성할 수 없도록 막아버리자.

// private 생성자 추가
    private ClassGrade() {

    }
  • private을 사용하여 ClassGrade 인스턴스를 함부로 생성할 수 없도록 제한하였다.
  • 이제 ClassGrade 인스턴스를 사용할 때 내부로 정의한 상수를 이용해야한다. 그렇지 않을 경우 컴파일 에러가 발생한다.

타입 안전 열거형 패턴의 특징

  • 타입 안정성 향상: 정해진 객체만 사용할 수 있기 때문에, 잘못된 값을 입력하는 근본적인 문제를 해결할 수 있다.

  • 데이터 일관성: 정해진 객체만 사용하므로 데이터 일관성이 보장된다.

  • 제한된 인스턴스 생성: 외부에서 이 인스턴스들만 사용할 수 있도록 제한한다.

  • 단점: 이 패턴을 구현하려면 많은 코드를 작성해야한다.

profile
오늘도 한 걸음씩 나아가

0개의 댓글