5.1 문자열과 타입 안전성

비즈니스 요구사항

고객은 3등급으로 나누고, 상품 구매시 등급별로 할인을 적용한다.

회원 등급과 가격을 입력하면 할인 금액을 계산해주는 클래스를 만들어보자.

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 메서드는 문자열을 입력받아 각각의 회원 등급에 맞는 할인을 적용한다.

지금과 같이 단순히 문자열을 입력하는 방식은, 오타가 발생하기 쉽고, 유효하지 않는 값이 입력될 수 있다.

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 에 정의된 문자열 상수를 사용하지 않고 직접 문자열을 사용해도 막을 수 있는 방법은 없다.