타입 안전 열거형 패턴
앞선 포스팅의 문제를 해결하기 위해 나온 것이 바로 타입 안전 열거형 패턴이다. 여기서 enum은 열거를 뜻하는 enumeration의 줄임말이다. 여기서 중요한 것은 타입 안전 열거형 패턴을 사용하면 나열한 항목만 사용할 수 있다는 것이다.
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
}
public class ClassRegMain {
public static void main(String[] args) {
System.out.println("class BASIC = " + ClassGrade.BASIC.getClass());
System.out.println("class GOLD = " + ClassGrade.GOLD.getClass());
System.out.println("class DIAMOND = " + ClassGrade.DIAMOND.getClass());
System.out.println("ref BASIC = " + ClassGrade.BASIC);
System.out.println("ref GOLD = " + ClassGrade.GOLD);
System.out.println("ref DIAMOND = " + ClassGrade.DIAMOND);
}
}
실행결과
=> 각각의 상수는 모두 ClassGrade 타입을 기반으로 인스턴스를 만들었기 때문에 getClass() 의 결과는 모두 ClassGrade이다.
각각 다른 ClassGrade 인스턴스를 참조하기 때문에 참조값이 다르게 출력된다.
public class DiscountService {
public int discount(ClassGrade grade, int price) {
int discountPercent =0;
if(grade == ClassGrade.BASIC) {
discountPercent = 10;
} else if(grade == ClassGrade.GOLD) {
discountPercent = 20;
} else if(gsrade == ClassGrade.DIAMOND) {
discountPercent = 30;
} else {
System.out.println(grade + ": 할인 X");
}
return price * discountPercent / 100;
}
}
Main 메서드
public class ClassGradeEx2_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);
}
}
=> 이 방식도 한계가 있다. 밑의 예제를 살펴보자.
public class ClassGradeEx2_2 {
public static void main(String[] args) {
int price = 10000;
DiscountService discountService = new DiscountService();
ClassGrade classGrade = new ClassGrade();
int result = discountService.discount(classGrade, price);
System.out.println("result = " + result);
}
}
=> 어떤 개발자가 코드를 오해해서 객체를 직접생성한다면 어떻게 될까
이 문제를 해결하려면 외부에서 ClassGrade를 생성할 수 없도록 막으면 된다. 기본 생성자를 private으로 변경하자
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 ClassGrade() {}
}
=> 이제 객체를 생성할 수 없다. 이를 타입 안전 열거형 패턴이라 한다.
타입 안전 열거형 패턴을 사용함으로써 타입 안정성이 향상되고, 데이터의 일관성이 보장되는 효과가 있다 . 단점은 이 패턴을 구현하려면 많은 코드를 작성해야 한다. 그리고 private 생성자를 추가하는 등 유의사항이 있다.
다음 포스팅에서 이 문제를 해결하기 위한 Enum Type 에 대해 알아볼 것이다.
* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 중급] 중첩 클래스, 내부 클래스 (0) | 2024.09.03 |
---|---|
[Java 중급] 열거형 - Enum Type (4) | 2024.08.29 |
[Java 중급] 열거형 - ENUM (0) | 2024.08.23 |
[Java 중급] Class 클래스 (0) | 2024.08.23 |
[Java 중급] 오토 박싱 (0) | 2024.08.22 |