사과와 오렌지

  • $5 + 10CHF = $10(환율이 2:1 일 경우)

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

  • 5CHF * 2 = 10CHF

  • Dollar/Franc 중복

  • 공용 equals

  • 공용 time

  • Franc과 Dollar 비교하기

이전 장 "공용 equals" 만들며 추가된 테스트 항목인 "Franc과 Dollar 비교하기" 를 진행해보자.

우선, 테스트 시나리오를 추가해보자.

@Test
void testEquality() {
    assertTrue(new Dollar(5).equals(new Dollar(5)));
    assertFalse(new Dollar(5).equals(new Dollar(6)));
    assertTrue(new Franc(5).equals(new Franc(5)));
    assertFalse(new Franc(5).equals(new Franc(6)));
    assertFalse(new Franc(5).equals(new Dollar(5)));
    assertFalse(new Dollar(5).equals(new Franc(5)));

}

테스트 결과는 실패이다. 이유는 동치성 코드에 Franc 와 Dollar을 구분할 수 있는 코드가 없기 때문이다.

따라서 동치성 코드에서는 Dollar, Franc 두 타입간의 비교가 이루어지고 있는 지 확인해야 한다.

public boolean equals(Object object) {
    Money money = (Money) object;
    return amount == money.amount;

}

Money 하위 타입 간 비교는 전혀 이루지고 있지 않다.

따라서 "클래스 동일 여부" 대한 코드를 추가하여 타입 비교를 하도록 리팩토링을 해보자.

public boolean equals(Object object) {
    Money money = (Money) object;
    return amount == money.amount && getClass().equals(money.getClass());

}

테스트가 통과하는 것을 확인할 수 있다.

드디어 공용 equals로 만드는 과정에서 발생했던 결함을 테스트로 담아내어 해결하였다. 해당 항목을 할일 항목에서 제거하자.

  • $5 + 10CHF = $10(환율이 2:1 일 경우)

  • $5 * 2 = 10$

  • amount를 private으로 만들기

  • Dollar 부작용(side effect)?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

  • 5CHF * 2 = 10CHF

  • Dollar/Franc 중복

  • 공용 equals

  • 공용 time

  • Franc과 Dollar 비교하기

  • 통화?

Last updated