๐ Chapter 9: ์ฐ๋ฆฌ๊ฐ ์ฌ๋ ์๊ฐ
ํตํ๋ฅผ ํํํ๊ธฐ ์ํ ๋ณต์กํ ๊ฐ์ฒด๋ค์ ์ํ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ฒด๋ค์ด ํ์ํ ๋งํผ๋ง ๋ง๋ค์ด์ง๋๋ก ํ๊ธฐ ์ํด ๊ฒฝ๋ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ๋น๋ถ๊ฐ์ ๊ทธ๋ฐ ๊ฒ๋ค ๋์ ๋ฌธ์์ด์ ์ฐ์.
public void testCurrency() {
assertEquals("USD", Money.dollar(1).currency());
assertEquals("CHF", Money.franc(1).currency());
}
์ฐ์ , Money
์ currency()
๋ฉ์๋๋ฅผ ์ ์ธํ์.
abstract String currency();
๊ทธ ๋ค์ ๋ ํ์ ํด๋์ค์์ ์ด๋ฅผ ๊ตฌํํ์.
// Franc
String currency() {
return "CHF";
}
// Dollar
String currency() {
return "USD";
}
์ฐ๋ฆฐ ๋ ํด๋์ค๋ฅผ ๋ชจ๋ ํฌํจํ ์ ์๋ ๋์ผํ ๊ตฌํ์ ์ํ๋ค. ํตํ๋ฅผ ์ธ์คํด์ค ๋ณ์์ ์ ์ฅํ๊ณ , ๋ฉ์๋์์๋ ๊ทธ๋ฅ ๊ทธ๊ฑธ ๋ฐํํ๊ฒ ๋ง๋ค ์ ์์ ๊ฒ ๊ฐ๋ค.
// Franc
private String currency;
Franc(int amount) {
this.amount = amount;
currency = "CHF";
}
String currency() {
return currency;
}
Dollar
๋ ๋๊ฐ์ด ๋ณ๊ฒฝํ์.
private String currency;
Dollar(int amount) {
this.amount = amount;
currency = "USD";
}
String currency() {
return currency;
}
์ด์ ๋ currency()
๊ฐ ๋์ผํ๋ฏ๋ก ๋ณ์ ์ ์ธ๊ณผ currency()
๊ตฌํ์ ๋ ๋ค ์๋ก ์ฌ๋ฆด ์ ์๊ฒ ๋๋ค.
// Money
protected String currency;
String currency() {
return currency;
}
๋ฌธ์์ด "USD"์ "CHF"๋ฅผ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ์ฎ๊ธด๋ค๋ฉด ๋ ์์ฑ์๊ฐ ๋์ผํด์ง ๊ฒ์ด๊ณ , ๊ทธ๋ ๋ค๋ฉด ๊ณตํต ๊ตฌํ์ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค.
์ฐ์ ์์ฑ์์ ์ธ์๋ฅผ ์ถ๊ฐํ์.
// Franc
Franc(int amount, String currency) {
this.amount = amount;
this.currency = "CHF";
}
์์ฑ์๋ฅผ ํธ์ถํ๋ ์ฝ๋ ๋ ๊ณณ์ด ๊นจ์ง๋ค.
// Money
static Money franc(int amount) {
return new Franc(amount, null);
}
// Franc
Money times(int multiplier) {
return Money.franc(amount * multiplier);
}
์ด์ ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ "CHF"๋ฅผ ์ ๋ฌํ ์ ์๋ค.
// Money
static Money franc(int amount) {
return new Franc(amount, "CHF");
}
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์ธ์๋ฅผ ์ธ์คํด์ค ๋ณ์์ ํ ๋นํ ์ ์๋ค.
// Franc
Franc(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
๋ด๊ฐ ์ด๋ฐ ์์ ๋จ๊ณ๋ฅผ ๋ฐ์๊ฐ๋ ๊ฒ์ ๋ํด์ ๋ค์๊ธ ๋ฐฉ์ด์ ์ผ๋ก ๋๋ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ์ฌ๋ฌ๋ถ์๊ฒ ์ ๋ง ์ด๋ฐ ์์ผ๋ก ์ผํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฑด๊ฐ? ์๋๋ค. ๋๋ ์ฌ๋ฌ๋ถ์ด ์ด๋ฐ ์์ผ๋ก๋ ์ผํ ์๋ ์์ด์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด๋ค.
// Money
static Money dollar(int amount) {
return new Dollar(amount, "USD");
}
// Dollar
Dollar(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
Money times(int multiplier) {
return Money.dollar(amount * multiplier);
}
์ง๊ธ๊ณผ ๊ฐ์ ์ผ์ TDD๋ฅผ ํ๋ ๋์ ๊ณ์ ํด์ฃผ์ด์ผ ํ๋ ์ผ์ข ์ ์กฐ์จ์ด๋ค. ์ข ์ข ๊ฑธ์์ผ๋ก ์งํํ๋ ๊ฒ์ด ๋ต๋ตํ๊ฐ? ๊ทธ๋ฌ๋ฉด ๋ณดํญ์ ์กฐ๊ธ ๋ํ๋ผ. ์ฑํผ์ฑํผ ๊ฑท๋ ๊ฒ์ด ๋ถ์ํ๊ฐ? ๊ทธ๋ผ ๋ณดํญ์ ์ค์ฌ๋ผ. TDD๋ ์กฐ์ข ํด ๋๊ฐ๋ ๊ณผ์ ์ด๋ค. ์ด์ชฝ์ผ๋ก ์กฐ๊ธ, ์ ์ชฝ์ผ๋ก ์กฐ๊ธ. ์ง๊ธ๋, ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก๋ ์ ํด์ง ์ฌ๋ฐ๋ฅธ ๋ณดํญ์ด๋ผ๋ ๊ฒ์ ์กด์ฌํ์ง ์๋๋ค.
๋ ์์ฑ์๊ฐ ์ด์ ๋์ผํด์ก๋ค. ๊ตฌํ์ ์์ ํด๋์ค์ ์ฌ๋ฆฌ์.
// Money
Money(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
// Franc
Franc(int amount, String currency) {
super(amount, currency);
}
// Dollar
Dollar(int amount, String currency) {
super(amount, currency);
}