이제 앞서 2장의 (1)에서 만들었던 상영(Screening) 클래스와 함께하는 클래스(객체)들과 함께 코드로 설명할 것이다.
※2장. (1)에서 2-5) 까지 했으므로. 2-6부터 시작.
목차
상영클래스의 2가지 메서드를 추가한다.
public class Screening {
// ... 생략
public Reservation reserve(Customer customer, int audienceCount) {
return new Reservation(customer, this, calculateFee(audienceCount), audienceCount);
}
private Money calculateFee(int audienceCount) {
return movie.calculateMovieFee(this).times(audienceCount);
}
}
reserve 메서드는 calculateFee을 호출하여, 요금을 계산한 후 Reservation클래스의 생성자에 데이터를 전달한다.
calculateFee메서드는 Movie클래스의 calculateMovieFee메서드를 호출한다. ( 1인당 요금을 반환 받기 위하여 )
또, 1인당 요금을 구해야 하므로, calculateMovieFee.times() 라는 메서드로 인원수를 전달한다.
times는 값을 곱하는 메서드를 Movie에 만들면 된다.
금액과 계산에 관련된 Money 클래스를 구현한다.
public class Money {
public static final Money ZERO = Money.wons(0);
private final BigDecimal amount; // 요금
//생성자
public Money(BigDecimal amount) {
this.amount = amount;
}
public static Money wons(long amount) {
return new Money(BigDecimal.valueOf(amount));
}
public static Money wons(double amount) {
return new Money(BigDecimal.valueOf(amount));
}
public Money plus(Money amount) {
return new Money(this.amount.add(amount.amount));
}
public Money minus(Money amount) {
return new Money(this.amount.subtract(amount.amount));
}
public Money times(double percent) {
return new Money(this.amount.multiply(BigDecimal.valueOf(percent))); //인당 곱하기
}
public boolean isLessThan(Money other) {
return amount.compareTo(other.amount) < 0;
}
public boolean isGreaterThanOrEqual(Money other) {
return amount.compareTo(other.amount) >= 0;
}
}
금액은 Long타입 변수가 아닌, BigDecimal 변수를 사용하여 좀 더 명시적으로 표현하였다.