고객은 3등급으로 나누고, 상품 구매시 등급별로 할인을 적용한다.
BASIC
-> 10% 할인GOLD
-> 20% 할인DIAMOND
-> 30% 할인회원 등급과 가격을 입력하면 할인 금액을 계산해주는 클래스를 만들어보자.
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;
}
}
위의 discount
메서드는 문자열을 입력받아 각각의 회원 등급에 맞는 할인을 적용한다.
지금과 같이 단순히 문자열을 입력하는 방식은, 오타가 발생하기 쉽고, 유효하지 않는 값이 입력될 수 있다.
"GOLD", "gold", "Gold"
등 다양한 형식으로 문자열을 입력할 수 있어 일관성이 떨어진다.String
으로 상태나 카테고리를 표현하면, 잘못된 문자열을 실수로 입력할 가능성이 있다. (예 오타)public class StringGrade {
public static final String BASIC = "BASIC";
public static final String GOLD = "GOLD";
public static final String DIAMOND = "DIAMOND";
}
상수는 미리 정의한 변수명을 사용할 수 있기 때문에 문자열을 직접 사용하는 것 보다는 더 안전하다.
이제 discount
메서드에 회원 등급을 보낼때 StringGrade.BASIC
처럼 상수로 보내면 된다.
하지만 문자열 상수를 사용해도, 지금까지 발생한 문제들을 근본적으로 해결할 수는 없다. 왜냐하면 String
타입은 어떤 문자열이든 입력할 수 있기 때문이다. 즉 StringGrade
에 정의된 문자열 상수를 사용하지 않고 직접 문자열을 사용해도 막을 수 있는 방법은 없다.