1부 8장 객체만들기

< 현재 구현해야할 목록 >

  • $5 + 10CHF = $10 (환율이 2:1일 경우)
  • $5 * 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용
  • Money 반올림
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • ~~ 5CHF * 2 = 10CHF~~
  • Dollar/Franc 중복제거
  • 공용 equals
  • 공용 times
  • Franc과 Dollar 비교하기
  • 통화?

Dollar 와 Franc의 times code가 거의 같다.

양쪽 모두 Money를 반환하게 만들면 더 비슷하게 만들 수 있다.


// Dollar
public class Dollar extends Money {
    public Dollar(int amount) {
        this.amount = amount;
    }

    Money times(int multiplier) {
        return new Dollar( amount * multiplier);
    }

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


// Franc
public class Franc extends Money{

    public Franc(int amount) {
        this.amount = amount;
    }

    Money times(int multiplier) {
        return new Franc( amount * multiplier);
    }

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

하위 class에 대한 참조가 적어진다면 발전을 이뤘다고 할 수 있다.

  • Money class 에 Dollar를 생성한다.
public class Money {
    protected int amount;

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

    static Dollar dollar(int amount) {
        return new Dollar(amount);
    }
}
  • test code에서 Dollar 선언부를 바꾼다.
  @Test
    public void testMultiplication() {
        Money five = Money.dollar(5);
        assertEquals(new Dollar(10), five.times(2));
        assertEquals(new Dollar(15), five.times(3));
    }
  • Money에 times 를 선언하면서 abstract로 바꿔준다.
abstract class Money {
    protected int amount;
    abstract Money times(int multiplier);
    public boolean equals(Object object) {
        Money money = (Money) object;
        return amount == money.amount && getClass().equals(money.getClass());
    }

    static Money dollar(int amount) {
        return new Dollar(amount);
    }
}
  • Franc 도 Money class 에 추가해준다.
abstract class Money {
    protected int amount;
    abstract Money times(int multiplier);
    public boolean equals(Object object) {
        Money money = (Money) object;
        return amount == money.amount && getClass().equals(money.getClass());
    }

    static Money dollar(int amount) {
        return new Dollar(amount);
    }
    
    static Money franc(int amount) {
        return new Franc(amount);
    }
}

< 현재 구현해야할 목록 >

  • $5 + 10CHF = $10 (환율이 2:1일 경우)
  • $5 * 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용
  • Money 반올림
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • ~~ 5CHF * 2 = 10CHF~~
  • Dollar/Franc 중복제거
  • 공용 equals
  • 공용 times
  • Franc과 Dollar 비교하기
  • 통화?

다음 장에서 times() 중복을 걷어낼 것이다.

지금까지 우리는

  • 동일한 times()의 두 변이형 메서드 서명부를 통일 시킴으로 중복을 조금이나마 제거했다.
  • 최소한 메서드 선언부만이라도 공동 상위 클래스(Money)로 옮겼다.
  • 테스트 코드에서 하위클래스 존재 사실을 분리했다.
  • 하위 클래스가 사라지면 몇몇 테스트는 불필요하게 된다는 사실을 알았지만 일단 두었다.

좋은 웹페이지 즐겨찾기