๐ 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 {
}
Franc.equals()
๋ Money.equals()
์ ๊ฑฐ์ ๋น์ทํด ๋ณด์ธ๋ค. ์ด ๋ ๋ถ๋ถ์ ์์ ํ ๋๊ฐ์ด ๋ง๋ค ์ ์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ์๋ฏธ๋ฅผ ๋ณํ์ํค์ง ์๊ณ Franc
์ equals()
๋ฅผ ์ง์๋ฒ๋ฆด ์ ์๊ฒ ๋๋ค. ์ฐ์ ์์ ๋ณ์์ ์ ์ธ ๋ถ๋ถ์ ๊ณ ์น์.
public boolean equals(Object object) {
Money franc = (Franc) object;
return amount == franc.amount;
}
๊ทธ ๋ค์์ ์บ์คํธ ๋ถ๋ถ์ ์์ ํ๋ค.
public boolean equals(Object object) {
Money franc = (Money) object;
return amount == franc.amount;
}
์์ ๋ณ์์ ์ด๋ฆ๋ ์์ ํด๋์ค์ ๋ง๊ฒ ๊ณ ์ณ์ผ ํ๋ ๊ฑธ๊น? ๊ทธ๊ฑด ์ฌ๋ฌ๋ถ์ ์์ฌ์ ๋งก๊ธฐ๊ฒ ๋ค... ๊ทธ๋, ๊ณ ์ณ๋ณด์.
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount;
}
์ด์ Franc.equals()
์ Money.equals()
์ฌ์ด์ ๋ค๋ฅธ ์ ์ด ์์ผ๋ฏ๋ก Franc
์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์. ๊ทธ๋ฆฌ๊ณ ํ
์คํธ๋ฅผ ๋๋ ค๋ณด์. ์ ๋์๊ฐ๋ค.
๊ทธ๋ฐ๋ฐ Franc
๊ณผ Dollar
๋ฅผ ๋น๊ตํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด๊ฑด 7์ฅ์์ ๋ค๋ฃจ๋๋ก ํ์.