๐น 10. Object Oriented Design
07. ๊ฐ์ฒด ์งํฅ ์ค๊ณ
[ ์ ๊ทผ๋ฒ ]
๋จ๊ณ #1: ๋ชจํธ์ฑ์ ํด์
๊ฐ์ฒด ์งํฅ ์ค๊ณ(OOD) ๊ด๋ จ ๋ฌธ์ ๋ค์ ๋๊ฒ ๊ณ ์์ ์ผ๋ก ๋ชจํธ์ฑ์ ๋๊ณ ์๋ค. ์๋ํ๋ฉด ๋ฉด์ ๊ด๋ค์ ์ค์ค๋ก ๊ฐ์ ์ ๋ง๋ค์ด๋ด๊ณ ์ง๋ฌธ์ ํตํด ๋ช ํํ ํด๋๊ฐ๋ ๊ณผ์ ์ ์ดํด๋ณด๊ณ ์ถ์ดํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒฐ๊ตญ, ๋ฌด์์ ๊ฐ๋ฐํด์ผ ํ๋์ง ์ดํดํ์ง ๋ชปํ ์ํ์์ ์ฝ๋ฉ๋ถํฐ ์์ํ๋ ๊ฐ๋ฐ์๋ ํ์ฌ์ ์๊ฐ๊ณผ ๋์ ๋ญ๋นํ๋ฉฐ, ๊ทธ๋ณด๋ค ๋ ์ฌ๊ฐํ ๋ฌธ์ ๋ค์ ๋ง๋ค์ด ๋ธ๋ค.
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๊ดํ ์ง๋ฌธ์ ๋ฐ์ผ๋ฉด, ์๋์ ๋ํ ์ง๋ฌธ์ ๋์ ธ์ผ ํ๋ค.
โ ๋๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ
โ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ์ง
์ง๋ฌธ์ ๋ฐ๋ผ์๋ ์กํ์์น์ ๋ฐ๋ฅธ ์ง๋ฌธ์ ๋์ ธ์ผ ํ ๋๋ ์๋ค. ๋๊ฐ, ๋ฌด์์, ์ด๋์, ์ธ์ , ์ด๋ป๊ฒ, ์.
ex) ์ปคํผ ๋ฉ์ด์ปค์ ๋ํ ๊ฐ์ฒด ์งํฅ์ ์ค๊ณ๋ฅผ ํ๋ค๊ณ ํด๋ณด์.
์ปคํผ ๋ฉ์ด์ปค๋ ์๊ฐ๋น ์๋ฐฑ ๋ช ์ ๊ณ ๊ฐ์ ์๋ํ๋ฉฐ ์ด ๊ฐ์ง ์ด์์ ์ ํ์ ๋ง๋ค์ด ๋ด์ผ ํ๋, ๋๊ท๋ชจ ์๋น์ ์ค์น๋๋ ๊ธฐ๊ณ์ผ ์๋ ์๋ค. ํน์ ๋์ด ๋์ ๋ถ๋ค์ด ์ฌ์ฉํ๋, ๋ธ๋ ์ปคํผ๋ง ๋ง๋๋ ๊ฐ๋จํ ๊ธฐ๊ณ์ผ ์๋ ์๋ค. ์ด๋ค ์ฉ๋๋ก ์ฐ์ด๋๋์ ๋ฐ๋ผ ์ค๊ณ ์์ฒด๊ฐ ์์ ํ ๋ค๋ฐ๋๋ค.
๋จ๊ณ #2: ํต์ฌ ๊ฐ์ฒด์ ์ค๊ณ
์ด์ ๋ฌด์์ ์ค๊ณํ ๊ฒ์ธ์ง ์ดํดํ์ผ๋, ์์คํ ์ ๋ฃ์ โํต์ฌ ๊ฐ์ฒดโ(core object)๊ฐ ๋ฌด์์ธ์ง ์๊ฐํด ๋ด์ผ ํ๋ค.
ex) ์๋น์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ๋ค๊ณ ํด๋ณด์.
์ด๋ ํต์ฌ ๊ฐ์ฒด๋ก๋ Table, Guest, Party, Order, Meal, Employee, Server, Host ๋ฑ์ด ์์ ์ ์๋ค.
๋จ๊ณ #3: ๊ด๊ณ ๋ถ์
ํต์ฌ ๊ฐ์ฒด๋ฅผ ์ด๋ ์ ๋ ๊ฒฐ์ ํ๋ค๋ฉด, ์ด์ ๊ฐ์ฒด ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ถ์ํด์ผ ํ๋ค.
โ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด์ ์ํด ์๋๊ฐ(member)?
โ ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์์(inherit) ๋ฐ์์ผ ํ๋ ๊ฐ์ฒด๋ ์๋?
โ ๊ด๊ณ๋ ๋ค-๋-๋ค(many-to-many) ๊ด๊ณ์ธ๊ฐ ์๋๋ฉด ์ผ-๋-๋ค(one-to-many) ๊ด๊ณ์ธ๊ฐ?
๊ฐ๋ น, ์๋น ๋ฌธ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค๊ณํด ๋ณผ ์ ์๋ค.
- Party๋ Guests ๋ฐฐ์ด์ ๊ฐ๊ณ ์์ด์ผ ํ๋ค.
- Server์ Host๋ Employee๋ฅผ ์์๋ฐ๋๋ค.
- ๊ฐ Table์ Party๋ฅผ ํ๋๋ง ๊ฐ์ง ์ ์์ง๋ง, ๊ฐ Party๋ Tables๋ฅผ ์ฌ๋ฌ ๊ฐ ๊ฐ์ง ์ ์๋ค.
- Restaurant์ Host๋ ํ ๋ช ๋ฟ์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, ์ข ์ข ์๋ชป๋ ๊ฐ์ ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด, ํ๋์ Table์ ์ฌ๋ฌ Party๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์๋ ์๋ค(์์ฆ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ ๋ํ ๊ณต๋ ํ ์ด๋ธ(communal table)์ด ๊ทธ๋ฐ ๊ฒฝ์ฐ์ด๋ค). ์ค๊ณ๊ฐ ์ผ๋ง๋ ์ผ๋ฐ์ ์ด์ด์ผ ํ๋์ง์ ๊ดํด์๋ ๋ฉด์ ๊ด๊ณผ ์์ํ ํ ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ข๋ค.
๋จ๊ณ #4: ํ๋ ๋ถ์
์ฌ๊ธฐ๊น์ง ์๋ค๋ฉด ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๊ณจ๊ฒฉ์ ์ด๋ ์ ๋ ์กํ ์ํ์ผ ๊ฒ์ด๋ค. ์ด์ ๋จ์ ์ผ์ ๊ฐ์ฒด๊ฐ ์ํํด์ผ ํ๋ ํต์ฌ ํ๋(core action)๋ค์ ๋ํด์ ์๊ฐํ๊ณ , ์ด๋ค์ด ์ด๋ป๊ฒ ์ํธ์์ฉํด์ผ ํ๋์ง ๋ฐ์ ธ ๋ณด๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ฉด ๊น๋นก ์์ ๊ฐ์ฒด๊ฐ ์์ ์๋ ์๊ณ , ์ํฉ์ ๋ฐ๋ผ ์ค๊ณ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ์๋ ์๋ค.
ex) ํ Party๊ฐ Restaurant์ ์ ์ฅํ๊ณ , ํ Guest๊ฐ Host์๊ฒ Table์ ๋ถํํ ๊ฒฝ์ฐ
Host๋ Reservation์ ์ดํด๋ณธ ๋ค์ ์๋ฆฌ๊ฐ ์์ผ๋ฉด ํด๋น Party์๊ฒ Table์ ๋ฐฐ์ ํ ๊ฒ์ด๋ค. ์๋ฆฌ๊ฐ ์๋ค๋ฉด Party๋ Reservation ๋ฆฌ์คํธ ๋งจ ๋ง์ง๋ง์ ์ถ๊ฐ๋ ๊ฒ์ด๋ค. ํ Party๊ฐ ์์ฌ๋ฅผ ๋ง์น๊ณ ๋ ๋๋ฉด ํ Table์ด ๋น๊ฒ ๋๊ณ , ๊ทธ ํ ์ด๋ธ์ ๋ฆฌ์คํธ์ ๋งจ ์ Party์๊ฒ ํ ๋น๋ ๊ฒ์ด๋ค.
[ ๋์์ธ ํจํด ]
์ฑ๊ธํค(singleton)์ด๋ ํฉํฐ๋ฆฌ ๋ฉ์๋(factory method)์ ๊ฐ์ ๋์์ธ ํจํด์ ์ดํด๋ณธ๋ค.
๊ณ์ํด์ ํน์ ๋ฌธ์ ์ โ๊ฐ์ฅโ ์ ํฉํ ๋์์ธ ํจํด์ ์ฐพ์ผ๋ ค๋ ํจ์ ์ ๋น ์ง์ง ์๋๋ก ์กฐ์ฌํ๋ผ. ํ์ํ๋ค๋ฉด ๊ทธ ๋ฌธ์ ์ ์ ํฉํ ๋์์ธ์ ์ง์ ๋ง๋ค๋ฉด ๋๋ค. ํน๋ณํ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ ๋ง๋ค์ด์ง ํจํด์ด ์ ํฉํ ์๋ ์๊ฒ ์ง๋ง, ๋ง์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์๋ค.
์ฑ๊ธํค ํด๋์ค(singleton class)
- ์ฑ๊ธํค ํจํด(singleton pattern)
์ด๋ค ํด๋์ค๊ฐ ์ค์ง ํ๋์ ๊ฐ์ฒด๋ง์ ๊ฐ๋๋ก ํ๋ฉฐ, ํ๋ก๊ทธ๋จ ์ ๋ฐ์ ๊ฑธ์ณ ๊ทธ ๊ฐ์ฒด ํ๋๋ง ์ฌ์ฉ๋๋๋ก ๋ณด์ฅ
โ ์ ํํ ํ๋๋ง ์์ฑ๋์ด์ผ ํ๋ ์ ์ญ ๊ฐ์ฒด(global object)๋ฅผ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ์ ํนํ ์ ์ฉ
ex) Restaurant ํด๋์ค๋ ์ ํํ ํ๋์ ๊ฐ์ฒด๋ง ๊ฐ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค.
1
2
3
4
5
6
7
8
9
10
public class Restaurant {
private static Restaurant _instance = null;
protected Restaurant() { ... }
public static Restaurant getInstance() {
if (_instance == null) {
_instance = new Restaurant();
}
return _instance;
}
}
๋ง์ ์ฌ๋๋ค์ด ์ฑ๊ธํค ๋์์ธ ํจํด์ ์ข์ํ์ง ์๊ณ ์ฌ์ง์ด โ์ํฐ-ํจํดโ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค. ์ฑ๊ธํค์ ์ซ์ดํ๋ ์ด์ ์ค ํ๋๋ ์ฑ๊ธํค์ด ๋จ์ ํ ์คํธ(unit test)์ ๋ฐฉํด๋๋ ์์ธ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํฉํฐ๋ฆฌ ๋ฉ์๋(factory method)
- ํฉํฐ๋ฆฌ ๋ฉ์๋
์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋, ํ์ ํด๋์ค์์ ์ด๋ค ํด๋์ค๋ฅผ ์์ฑํ ์ง ๊ฒฐ์ ํ ์ ์๋๋ก ๋์์ค
- ๊ตฌํ ๋ฐฉ๋ฒ
- 1๋ฒ์งธ: Factory ๋ฉ์๋ ์์ฒด์ ๋ํ ๊ตฌํ์ ์ ๊ณตํ์ง ์๊ณ ๊ฐ์ฒด ์์ฑ ํด๋์ค๋ฅผ abstract๋ก ์ ์ธํ๊ณ ๋๋๋ ๊ฒ
- 2๋ฒ์งธ: Factory ๋ฉ์๋๋ฅผ ์ค์ ๋ก ๊ตฌํํ Creator ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ. ์ด ๊ฒฝ์ฐ์๋ Factory ๋ฉ์๋์ ์์ฑํด์ผ ํ ํด๋์ค๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค์ผ ํ๋ค.
1 2 3 4 5 6 7 8 9 10
public class CardGame { public static CardGame createCardGame(GameType type) { if (type == GameType.Poker) { return new PockerGame(); } else if (type == GameType.BlackJack) { return new BlackJackGame(); } return null; } }