1부 8장 객체만들기
< 현재 구현해야할 목록 >
- $5 + 10CHF = $10 (환율이 2:1일 경우)
$5 * 2 = $10amount를 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 = $10amount를 private로 만들기Dollar 부작용- Money 반올림
equals()- hashCode()
- Equal null
- Equal object
- ~~ 5CHF * 2 = 10CHF~~
- Dollar/Franc 중복제거
공용 equals- 공용 times
Franc과 Dollar 비교하기- 통화?
다음 장에서 times() 중복을 걷어낼 것이다.
지금까지 우리는
- 동일한 times()의 두 변이형 메서드 서명부를 통일 시킴으로 중복을 조금이나마 제거했다.
- 최소한 메서드 선언부만이라도 공동 상위 클래스(Money)로 옮겼다.
- 테스트 코드에서 하위클래스 존재 사실을 분리했다.
- 하위 클래스가 사라지면 몇몇 테스트는 불필요하게 된다는 사실을 알았지만 일단 두었다.
Author And Source
이 문제에 관하여(1부 8장 객체만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@miiunii/1부-8장-객체만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)