이제 앞서 2장의 (1)에서 만들었던 상영(Screening) 클래스와 함께하는 클래스(객체)들과 함께 코드로 설명할 것이다.

※2장. (1)에서 2-5) 까지 했으므로. 2-6부터 시작.

목차

2-6) 협력하는 객체들의 공동체 ( p 46 ~

상영클래스의 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 변수를 사용하여 좀 더 명시적으로 표현하였다.