$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()
Equal null
Equal object
5CHF X 2 = 10CHF
Dollar/Franc 중복
공용 equals
공용 times
Franc과 Dollar 비교하기
통화?
testFrancMultiplication 제거
두 times() 구현이 거의 비슷하긴 하지만 아직 완전히 동일 하지 않다.
//Dollar
public Money times(int multiplier) {
return Money.dollar(amount * multiplier);
}
//Franc
public Money times(int multiplier) {
return Money.franc(amount * multiplier);
}
팩토리 메서드를 인라인 시키면 어떨까?
//Dollar
public Money times(int multiplier) {
return new Dollar(amount * multiplier,"USD");
}
//Franc
public Money times(int multiplier) {
return new Franc(amount * multiplier,"CHF");
}
우리는 currency라는 필드명을 알고 있고 생성자가 하나만 있기 때문에 currency는 바로 값이 할당 된다는 것을 알고 있다. 그렇다면
//Dollar
public Money times(int multiplier) {
return new Dollar(amount * multiplier, currency);
}
//Franc
public Money times(int multiplier) {
return new Franc(amount * multiplier, currency);
}
이렇게 바뀌어도 다르지 않다는 것을 쉽게 알수 있는것 같다.
이후 Money를 반환하도록 고쳐보자.
//Dollar
public Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
//Franc
public Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
근데 이렇게하면 Money는 추상클래스이기에 오류가 난다 이 오류가 안나게 고쳐보자
Money times(int multiplier) {
return null;
}
/*더 나은 메세지를 보기위해 toString()을 정의하자*/
@Override
public String toString() {
return amount + " " +currency;
}
정말로 검사해야 할 것은 클래스가 같은지가 아니라 currency가 같은지 여부다.
@Override
public boolean equals(Object o) {
Money money = (Money) o;
return amount == money.amount &&
getClass().equals(money.getClass());
}
↓
@Override
public boolean equals(Object o) {
Money money = (Money) o;
return amount == money.amount &&
currency().equals(money.currency);
}
테스트 코드를 작성해보자 우리는 Franc생성자와 Money의 두 요소가 같다면 같아야 한다.
@Test
public void testDifferentClassEquality(){
assertTrue(new Money(10,"CHF").equals(
new Franc(10,"CHF")));
}
우리는 Money 생성자를 재정의 하고 equals도 정의가 되었으니
각각의 Dollar와 Franc에 정의된 times()를 push up 하여 사용가능하다!
Money
public Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()
Equal null
Equal object
5CHF X 2 = 10CHF
Dollar/Franc 중복
공용 equals
공용 times
Franc과 Dollar 비교하기
통화?
testFrancMultiplication 제거
지금까지 일을 검토해보자