π Chapter 10: ν₯λ―Έλ‘μ΄ μκ°
λ times()
ꡬνμ΄ κ±°μ λΉμ·νκΈ° νμ§λ§ μμ§ μμ ν λμΌνμ§λ μλ€.
// Franc
Money times(int multiplier) {
return Money.franc(amount * multiplier);
}
// Dollar
Money times(int multiplier) {
return Money.dollar(amount * multiplier);
}
μ΄ λμ λμΌνκ² λ§λ€κΈ° μν λͺ λ°±ν λ°©λ²μ΄ μλ€. λλ‘λ μ μ§νκΈ° μν΄μ λ¬Όλ¬μμΌ ν λλ μλ λ²μ΄λ€. ν©ν 리 λ©μλλ₯Ό μΈλΌμΈμν€λ©΄ μ΄λ¨κΉ?
// Franc
Money times(int multiplier) {
return new Franc(amount * multiplier, "CHF");
}
// Dollar
Money times(int multiplier) {
return new Dollar(amount * multiplier, "USD");
}
Franc
μμλ μΈμ€ν΄μ€ λ³μ currency
κ° νμ CHF
μ΄λ―λ‘ λ€μκ³Ό κ°μ΄ μΈ μ μλ€.
// Franc
Money times(int multiplier) {
return new Franc(amount * multiplier, currency);
}
μ λμκ°λ€. Dollar
λ λ§μ°¬κ°μ§λ‘ κ³ μΉ μ μλ€.
Money times(int multiplier) {
return new Dollar(amount * multiplier, currency);
}
Franc
μ κ°μ§μ§ Money
λ₯Ό κ°μ§μ§κ° μ λ§λ‘ μ€μν μ¬μ€μΈκ°? μμ€ν
μ λν΄ μλ μ§μμ κΈ°λ°μΌλ‘ μ‘°μ¬μ€λ½κ² μκ°ν΄λ³΄μ ν λ¬Έμ λ€. νμ§λ§ μ°λ¦¬μκ² κΉλν μ½λμ κ·Έ μ½λκ° μ μλν κ±°λΌλ λ―Ώμμ μ€ μ μλ ν
μ€νΈ μ½λλ€μ΄ μλ€. λͺ λΆ λμ κ³ λ―Όνλ λμ κ·Έλ₯ μμ νκ³ ν
μ€νΈλ₯Ό λλ €μ μ»΄ν¨ν°μκ² μ§μ λ¬Όμ΄λ³΄μ. TDDλ₯Ό κ°λ₯΄μΉλ€λ³΄λ©΄ νμ μ΄λ° μν©μ λ³΄κ² λλ€. μ»΄ν¨ν°λΌλ©΄ 10μ΄μμ 15μ΄ μ¬μ΄μ λλ΅ν μ μλ λ¬Έμ λ₯Ό λκ³ μ΅κ³ μ μννΈμ¨μ΄ μμ§λμ΄λ€μ΄ 5λΆμμ 10λΆ λμ κ³ λ―Όνκ³€ νλ€. κ°λμ κ·Έλ₯ μ»΄ν¨ν°μκ² λ¬Όμ΄λ³΄λ κ²λ μ’λ€.
μ€νμ μ€ννκΈ° μν΄ Franc.times()
κ° Money
λ₯Ό λ°ννλλ‘ κ³ μ³λ³΄μ.
// Franc
Money times(int multiplier) {
return Money(amount * multiplier, currency);
}
μ»΄νμΌλ¬κ° Money
λ₯Ό μ½ν¬λ¦¬νΈ ν΄λμ€λ‘ λ°κΏμΌ νλ€κ³ λ§νλ€.
// Money
class Money {
Money times(int amount) {
return null;
}
}
λΉ¨κ° λ§λλ€. μλ¬ λ©μμ§μλ κΈ°λλ§νΌ λμμ΄ λλ λ©μμ§κ° μλ κ² κ°λ€. λ λμ λ©μμ§λ₯Ό 보기 μν΄ toString()
μ μ μνμ.
// Money
public String toString() {
return amount + " " + currency;
}
ν! ν
μ€νΈλ μμ΄ μ½λλ₯Ό μμ±νλ€? κ·Έλλ λλ 건κ°? toString()
μ μμ±νκΈ° μ μ ν
μ€νΈλ₯Ό μμ±νλ κ² λ§λ€. νμ§λ§
- μ°λ¦° μ§κΈ νλ©΄μ λνλλ κ²°κ³Όλ₯Ό λ³΄λ €λ μ°Έμ΄λ€.
toString()
μ λλ²κ·Έ μΆλ ₯μλ§ μ°μ΄κΈ° λλ¬Έμ μ΄κ² μλͺ» ꡬνλ¨μΌλ‘ μΈν΄ μ»κ² λ 리μ€ν¬κ° μ λ€.- μ΄λ―Έ λΉ¨κ° λ§λ μνμΈλ° μ΄ μνμμλ μλ‘μ΄ ν μ€νΈλ₯Ό μμ±νμ§ μλ κ² μ’μ κ² κ°λ€.
Franc
λμ Money
κ° μλ€. λ¬Έμ λ equals()
ꡬνμ μλ€.
// Money
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount && getClass().equals(money.getClass());
}
μ λ§λ‘ κ²μ¬ν΄μΌ ν κ²μ ν΄λμ€κ° κ°μμ§κ° μλλΌ currency
κ° κ°μμ§ μ¬λΆλ€.
λΉ¨κ° λ§λμΈ μν©μμλ ν
μ€νΈλ₯Ό μΆκ°λ‘ μμ±νκ³ μΆμ§ μλ€. νμ§λ§ μ§κΈμ μ€μ λͺ¨λΈ μ½λλ₯Ό μμ νλ €κ³ νλ μ€μ΄κ³ ν
μ€νΈ μμ΄λ λͺ¨λΈ μ½λλ₯Ό μμ ν μ μλ€. 보μμ μΈ λ°©λ²μΌλ‘ λ°λ₯΄μλ©΄ λ³κ²½λ μ½λλ₯Ό λλλ €μ λ€μ μ΄λ‘ λ§λ μνλ‘ λμκ°μΌ νλ€. κ·Έλ¬κ³ λμ equals()
λ₯Ό μν΄ ν
μ€νΈλ₯Ό κ³ μΉκ³ ꡬν μ½λλ₯Ό κ³ μΉ μ μκ² λκ³ , κ·Έ νμμΌ μλ νλ μΌμ λ€μ ν μ μλ€.
μ΄λ²μλ 보μμ μΌλ‘ ν΄λ³΄μ.
// Franc
Money times(int multiplier) {
return new Franc(amount * multiplier, currency);
}
λ€μ μ΄λ‘ λ§λλ‘ λμμλ€. μ°λ¦¬ μν©μ Franc(10, "CHF")
κ³Ό Money(10, "CHF")
κ° μλ‘ κ°κΈ°λ₯Ό λ°λΌμ§λ§, μ¬μ€μ κ·Έλ μ§ μλ€κ³ λ³΄κ³ λ κ²μ΄λ€. μ°λ¦¬λ μ΄κ±Έ κ·Έλλ‘ ν
μ€νΈλ‘ μ¬μ©ν μ μλ€.
public void testDifferentClassEquality() {
assertTrue(new Money(10, "CHF").equals(new Franc(10, "CHF")));
}
μμλλ‘ μ€ν¨νλ€. equals()
μ½λλ ν΄λμ€κ° μλλΌ currency
λ₯Ό λΉκ΅ν΄ μΌ νλ€.
// Money
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount && currency().equals(money.currency());
}
μ΄μ Franc.times()
μμ Money
λ₯Ό λ°νν΄λ ν
μ€νΈκ° μ¬μ ν ν΅κ³Όνκ² ν μ μλ€.
// Franc
Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
μ΄κ² Dollar.times()
μλ μ μ©λ κΉ?
// Dollar
Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
μ λλ€! μ΄μ λ ꡬνμ΄ λμΌν΄μ‘μΌλ, μμ ν΄λμ€λ‘ λμ΄ μ¬λ¦΄ μ μγ·.
// Money
Money times(int multiplier) {
return new Money(amount * multiplier, currency);
}
κ³±νκΈ°λ ꡬννμΌλ μ΄μ μ무κ²λ μ νλ λ©μ²ν νμ ν΄λμ€λ€μ μ κ±°ν μ μκ² λ€.