어떤 정수에 1을 더했을 때 우리는 원래 정수가 변할 거라고 예상하기보다는 원래 정수에 1이 더해진 새로운 값을 갖게 될 것을 예상한다. 하지만 일반적으로 객체는 우리 예상대로 작동하지 않는다.
값 객체 패턴(value object pattern)
객체를 값처럼 쓰는 패턴
값 객체를 사용하면 별칭 문제에 대해 걱정할 필요가 없다는 아주 큰 장점이 있다.
별칭문제?
예를 들어, 두번째 수표의 객체 값을 변화시키는 바람에 첫번째 수표의 객체 값까지 변하게 되는 문제
값 객체가 암시하는 것 중 하나는 모든 연산은 새 객체를 반환해야 한다는 것이다. 또다른 암시는 값 객체는 equals()를 구현해야 한다는 것인데, 이것이 값객체의 별칭문제를 해결할 수 있기 때문이다.
$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()
만약 Dollar를 해시 테이블의 키로 쓸 생각이라면 equals()를 구현할 때에 hashCode()를 같이 구현해야 한다. 이것을 할일 목록에 적어 놓고 이것 때문에 문제가 생기면 그 때 다루도록 하자.
@Test
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
}
흠... 두개의 주소값을 비교하기 때문에 당연히 빨간 막대다...
일단 빠르게 통과 시켜보자
@Override
public boolean equals(Object o) {
return true;
}
이미 테스트 케이스에서 다룬 5와 5가 같다는 것을 알기 때문에 단순히 true를 반환시켜 테스트를 통과 시켰다.
삼각측량
개인적으로 책을 읽다가 이해가 안되서 개인적인 멘토에게 물어봤다...
왼쪽에서 봤을때
오른쪽에서 봤을때
를 확인하고 그걸 통해서 더 정확한 측정이 가능하다는 것을 표현한다.
@Test
public void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
}
이제 동치성을 일반화해야 한다.
@Override
public boolean equals(Object o) {
Dollar dollar = (Dollar) o;
return amount == dollar.amount;
}
$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()
위의 내용들을 검토해보자