문자열과 타입 안정성
자바가 제공하는 열거형(Enum Type)을 이해하기 위해서 예제를 먼저 살펴보자.
예제
비즈니스 요구사항
고객은 3등급으로 나누고 , 상품 구매시 등급별로 할인을 적용한다.
package enumeration.ex0;
public class DiscountService {
public int discount(String grade, int price) {
int discountPercent =0;
if(grade.equals("BASIC")) {
discountPercent = 10;
} else if(grade.equals("GOLD")) {
discountPercent = 20;
} else if(grade.equals("DIAMOND")) {
discountPercent = 30;
} else {
System.out.println(grade + ": 할인 X");
}
return price * discountPercent / 100;
}
}
Main
public class StringGradeEx0_1 {
public static void main(String[] args) {
int price = 10000;
DiscountService discountService = new DiscountService();
int basic = discountService.discount("BASIC", price);
int gold = discountService.discount("GOLD", price);
int diamond = discountService.discount("DIAMOND", price);
System.out.println("BASIC 등급 할인 금액 : " + basic);
System.out.println("GOLD 등급 할인 금액 : " + gold);
System.out.println("DIAMOND 등급 할인 금액 : " + diamond);
}
}
=> 위의 예제처럼 단순히 문자열을 입력하는 방식은 오타가 발생하기 쉽고, 유효하지 않은 값이 입력될 수 있다. 실수로 VIP를 입력하면 어떻게 될까? 혹은 등급을 소문자로 입력했다고 생각해보자. 할인이 적용되지 않을 것이다.
등급에 문자열을 사용하는 경우 타입 안정성이 부족하고, 데이터 일관성이 떨어진다는 단점이 있다. 이런 오류는 컴파일 시에 감지가 불가하다.
이번에는 문자열 상수를 사용해서 예제를 다시 만들어보자.
public class StringGrade {
public static final String BASIC = "BASIC";
public static final String GOLD = "GOLD";
public static final String DIAMOND = "DIAMOND";
}
package enumeration.ex1;
public class DiscountService {
public int discount(String grade, int price) {
int discountPercent =0;
if(grade.equals(StringGrade.BASIC)) {
discountPercent = 10;
} else if(grade.equals(StringGrade.GOLD)) {
discountPercent = 20;
} else if(grade.equals(StringGrade.DIAMOND)) {
discountPercent = 30;
} else {
System.out.println(grade + ": 할인 X");
}
return price * discountPercent / 100;
}
}
package enumeration.ex1;
public class StringGradeEx1_1 {
public static void main(String[] args) {
int price = 10000;
DiscountService discountService = new DiscountService();
int basic = discountService.discount(StringGrade.BASIC, price);
int gold = discountService.discount(StringGrade.GOLD, price);
int diamond = discountService.discount(StringGrade.DIAMOND, price);
System.out.println("BASIC 등급 할인 금액 : " + basic);
System.out.println("GOLD 등급 할인 금액 : " + gold);
System.out.println("DIAMOND 등급 할인 금액 : " + diamond);
}
}
=> 문자열 상수를 사용해서 전체적으로 코드가 더 명확해졌다. 그리고 실수로 상수의 이름을 잘못 입력할 경우에도 컴파일 시점에 오류가 발생하므로 오류를 더 쉽게 찾을 수 있다.
하지만 문자열 상수를 사용해도 지금까지 발생한 문제들을 근본적으로 해결할 수 없다. 왜냐면 String 타입은 어떤 문자열이든 입력할 수 있기 때문이다. 어떤 개발자가 StringGrade 대신 문자열을 입력한다해도 프로그램이 동작할 것이다.
근본적인 해결을 위해서는 타입 열거형 패턴을 사용해야 한다.
* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java 중급] 열거형 - Enum Type (4) | 2024.08.29 |
---|---|
[Java 중급] 타입 안전 열거형 패턴 (0) | 2024.08.29 |
[Java 중급] Class 클래스 (0) | 2024.08.23 |
[Java 중급] 오토 박싱 (0) | 2024.08.22 |
[Java 중급] 자바 래퍼 클래스 (0) | 2024.08.22 |