10장. 흥미로운 시간

변주한·2022년 6월 9일
0

$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 제거

지금까지 일을 검토해보자

  • 두 times()를 일치시키기 위해 그 메서드들이 호출하는 다른 메서드들을 인라인시킨 후 상수를 변수로 바꿔주었다.
  • 단지 디버깅을 위해 테스트 없이 toString()을 작성했다.
  • Franc 대신 Money를 반환하는 변경을 시도한 뒤 그것이 잘 작동할지를 테스트가 말하도록 했다.
  • 실험해본 걸 뒤로 물리고 또 다른 테스트를 작성했다. 테스트를 작동 했더니 실험도 제대로 작동했다.
profile
늦었지만 꾸준히

0개의 댓글