๐ Chapter 6: ๋์์จ "๋ชจ๋๋ฅผ ์ํ ํ๋ฑ"
์ค์ ๋ก ์๋ก์ด ํ ์คํธ ์ผ์ด์ค๋ฅผ ํ๋ ์๋ํ๊ฒ ๋ง๋ค์๋ค. ํ์ง๋ง ํ ์คํธ๋ฅผ ๋นจ๋ฆฌ ํต๊ณผํ๊ธฐ ์ํด ๋ช ํค์ด๋ ๋๋ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ๋ถ์ด๋ ์์ฒญ๋ ์ฃ๋ฅผ ์ ์ง๋ ๋ค. ์ด์ ์ฒญ์ํ ์๊ฐ์ด๋ค.
๊ฐ๋ฅํ ๋ฐฉ๋ฒ ํ ๊ฐ์ง๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋์ค ์ค ํ๋๊ฐ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค. ๋ด๊ฐ ๊ทธ๋ ๊ฒ ํด๋ดค๋๋ฐ, ๊ฑฐ์ ์ด๋ค ์ฝ๋๋ ๊ตฌ์ํ์ง ๋ชปํ๋ค. ๋์ , ๋ ํด๋์ค์ ๊ณตํต ์์ ํด๋์ค๋ฅผ ์ฐพ์๋ผ ์๊ฐ์ด๋ค.
Money
ํด๋์ค๊ฐ ๊ณตํต์ equals
์ฝ๋๋ฅผ ๊ฐ๊ฒ ํ๋ฉด ์ด๋จ๊น? ๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํด๋ณด์.
class Money
๋ชจ๋ ํ
์คํธ๋ ์ฌ์ ํ ๋์๊ฐ ๊ฒ์ด๋ค. ๋ญ๊ฐ๋ฅผ ๊นจํธ๋ ธ์ ๊ฒ ๊ฐ์ง๋ ์๋ค. ์ด์จ๊ฑด ํ
์คํธ๋ฅผ ๋๋ ค๋ณด๊ธฐ ์ข์ ๋๋ค. Dollar
๊ฐ Money
๋ฅผ ์์๋ฐ๋๋ค๊ณ ํด๋ ์ฌ์ ํ ์ด๋ค ๊ฒ๋ ๊บ ์ง์ง ์๋๋ค.
class Dollar extends Money {
private int amount;
}
๋ญ๊ฐ ๊นจ์ก๋? ์๋๋ค. ํ
์คํธ๋ ์ฌ์ ํ ์ ๋๋ค. ์ด์ amount
์ธ์คํด์ค ๋ณ์๋ฅผ Money
๋ก ์ฎ๊ธธ ์ ์๋ค.
class Money {
protected int amount;
}
class Dollar extends Money {
}
ํ์ ํด๋์ค์์๋ ๋ณ์๋ฅผ ๋ณผ ์ ์๋๋ก ๊ฐ์์ฑ์ private
์์ protected
๋ก ๋ณ๊ฒฝํ๋ค.
์ด์ equals()
์ฝ๋๋ฅผ ์๋ก ์ฌ๋ฆฌ๋ ์ผ์ ํ ์ ์๊ฒ ๋๋ค. ์ฐ์ ์์๋ณ์๋ฅผ ์ ์ธํ๋ ๋ถ๋ถ์ ๋ณ๊ฒฝํ์.
public boolean equals(Object object) {
Money dollar = (Dollar) object;
return amount == dollar.amount;
}
๋ชจ๋ ํ ์คํธ๊ฐ ์ฌ์ ํ ์ ๋๋ค. ์ด์ ์บ์คํธ(cast) ๋ถ๋ถ์ ๋ณ๊ฒฝํ์.
public boolean equals(Object object) {
Money dollar = (Money) object;
return amount == dollar.amount;
}
์ข๋ ์ํํ ์์ฌ์ํต์ ์ํด ์์ ๋ณ์์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์.
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount;
}
์ด์ ์ด ๋ฉ์๋๋ฅผ Dollar
์์ Money
๋ก ์ฎ๊ธธ ์ ์๋ค.
์ด์ ๋ Franc.equals()
๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค. ์ ์ ํ ํ
์คํธ๋ฅผ ๊ฐ์ง ๋ชปํ ์ฝ๋์์ TDD๋ฅผ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
์์ ๊ฒ์ด๋ค. ์ถฉ๋ถํ ํ
์คํธ๊ฐ ์๋ค๋ฉด ์ง์ ํ
์คํธ๊ฐ ๊ฐ์ถฐ์ง์ง ์์ ๋ฆฌํฉํ ๋ง์ ๋ง๋๊ฒ ๋ ์๋ฐ์ ์๋ค. ๋ฆฌํฉํ ๋งํ๋ฉด์ ์ค์ํ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ํ
์คํธ๊ฐ ์ฌ์ ํ ํต๊ณผํ ์๋ ์๋ ๊ฒ์ด๋ค. ์ด๋ป๊ฒ ํ ํ
๊ฐ?
์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ผ. ๊ทธ๋ ๊ฒ ํ์ง ์์ผ๋ฉด ๊ฒฐ๊ตญ์๋ ๋ฆฌํฉํ ๋งํ๋ค๊ฐ ๋ญ๊ฐ ๊นจํธ๋ฆด ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ฌ๋ฌ๋ถ์ ๋ฆฌํฉํ ๋ง์ ๋ํด ์ ์ข์ ๋๋์ ๊ฐ๊ฒ ๋๊ณ , ๋ฆฌํฉํ ๋ง์ ๋ ํ๊ฒ ๋๋ค. ๋ฆฌํฉํ ๋ง์ ๋ ์ ๊ฒํ๋ฉด ์ค๊ณ์ ์ง์ด ์ ํ๋๊ณ , ๊ฒฐ๊ตญ ์ฌ๋ฌ๋ถ์ ํด๊ณ ๋ ๊ฒ์ด๋ค. ๋ฆฌํฉํ ๋งํ๊ธฐ ์ ์ ํ ์คํ ์ ํ์.
๋คํํ๋ ์ด๋ฒ ํ
์คํธ๋ ์์ฑํ๊ธฐ ์ฝ๋ค. ๊ทธ๋ฅ Dollar
ํ
์คํธ๋ฅผ ๋ณต์ฌํ์.
public void testEquality() {
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
assertTrue(new Franc(5).equals(new Franc(5)));
assertFalse(new Franc(5).equals(new Franc(6)));
}
๋ ์ค๋ณต์ด๋ค. ๋ ์ค์ด๋ ๋! ์ด๋ฒ์ ์ ์ง๋ฅธ ์ฃ์ ๋ํด์๋ ์์ฃํ๊ฒ ๋ ๊ฒ์ด๋ค.
class Franc extends Money {
private int amount;
}
Money
ํด๋์ค์ ์๋ ํ๋๋ฅผ ์ด์ฉํ๋ฉด Franc
์ amount
ํ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
class Franc extends Money {
}