์๋ฌธ
๋งํด ํ์ธ๋ฌ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์ ์กด์ฌํ๋ ์ธ ๊ฐ์ง ์ํธ ์ฐ๊ด๋ ๊ด์
- ๊ฐ๋
๊ด์ (Conceptual Perspective): ๋๋ฉ์ธ ์์ ์กด์ฌํ๋ ๊ฐ๋
๊ณผ ๊ฐ๋
๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํํ
- ๋๋ฉ์ธ (domain): ์ฌ์ฉ์๋ค์ด ๊ด์ฌ์ ๊ฐ์ง๊ณ ์๋ ํน์ ๋ถ์ผ๋ ์ฃผ์
- ๋ช
์ธ ๊ด์ (Specification Perspective): ์ํํธ์จ์ด ์์์ ์ด์ ์จ ์ฌ๋ ๊ฐ์ฒด๋ค์ ์ฑ
์์ ์ด์ ์ ๋ง์ถค
- ๊ฐ์ฒด์ ์ธํฐํ์ด์ค (interface)๋ฅผ ๋ฐ๋ผ๋ณธ๋ค.
- ๊ตฌํ ๊ด์ (Implementation Perspective): ๊ฐ์ฒด๋ค์ด ์ฑ ์์ ์ํํ๋ ๋ฐ ํ์ํ ๋์ํ๋ ์ฝ๋๋ฅผ ์์ฑ
์ ๊ด์ ๋ค์ด ์์๋๋ก ๊ฐ๋ฐ๋๋ ๊ฒ ์๋๋ผ, ํด๋์ค์์ ์ด ๊ด์ ๋ค์ด ๋ชจ๋ ๊ด์ฐฐ๋ ์ ์๋๋ก ์์ฑํด์ผ ํ๋ค.
์ปคํผ ์ ๋ฌธ์ ๋๋ฉ์ธ
์ปคํผ ์ ๋ฌธ์ ๋๋ฉ์ธ์ ์ ์ํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ปคํผ ์ ๋ฌธ์ ์์๋ ๋ฉ๋ดํ์ด ์๋ค.
- ๋ฉ๋ดํ ์์๋ ์๋ฉ๋ฆฌ์นด๋ ธ, ์นดํธ์น๋ ธ, ์บ๋ฌ๋ฉ ๋ง๋ผ์๋, ์์คํ๋ ์๊ฐ ์๋ค.
- ๋ฉ๋ดํ๊ณผ, ๊ฐ ๋ฉ๋ด๋ค์ ๋ชจ๋ ๊ฐ์ฒด๋ค.
- ์๋์ ๋ฉ๋ดํ์ ๋ณด๊ณ ๋ฐ๋ฆฌ์คํ์๊ฒ ์ํ๋ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ค.
- ์๋, ๋ฐ๋ฆฌ์คํ ๋ชจ๋ ๊ฐ์ฒด๋ค.
- ๋ฐ๋ฆฌ์คํ๋ ์์จ์ ์ผ๋ก ์ปคํผ๋ฅผ ์ ์กฐํ๋ค.
๊ด๊ณ ํ์ ํ๊ธฐ
๊ฐ ๊ฐ์ฒด์ ๊ด๊ณ๋ฅผ ํ์ ํด๋ณด์.
- ์๋์ ๋ฉ๋ดํ์์ ์ฃผ๋ฌธํ ์ปคํผ๋ฅผ ์ ํํ๋ค. ๋ฐ๋ผ์ ์๋๊ณผ ๋ฉ๋ดํ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๋ค.
- ์๋์ ๋ฐ๋ฆฌ์คํ์๊ฒ ์ฃผ๋ฌธ์ ํ๋ค. ๋ฐ๋ผ์ ์๋๊ณผ ๋ฐ๋ฆฌ์คํ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๋ค.
- ๋ฐ๋ฆฌ์คํ๋ ์ปคํผ๋ฅผ ์ ์กฐํ๋ค. ๋ฐ๋ผ์ ๋ฐ๋ฆฌ์คํ์ ์ปคํผ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๋ค.
- ๋ฉ๋ดํ์ ์ฌ๋ฌ ๋ฉ๋ด๋ฅผ ๋ค๊ณ ์๋ค. ์ด ๊ด๊ณ๋ฅผ ํฌํจ (containment) ๋๋ ํฉ์ฑ (composition)์ด๋ผ ํ๋ค.
- ์๋๊ณผ ๋ฉ๋ดํ์ด ์๋ก๋ฅผ ์๊ณ ์์ง๋ง ์๋์ด ๋ฉ๋ดํ์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ๊ด๊ณ๋ฅผ ์ฐ๊ด (association)์ด๋ผ๊ณ ํ๋ค. ์ฆ, ์์ ํฉ์ฑ ๊ด๊ณ๋ฅผ ์ ์ธํ ๋๋จธ์ง ๊ด๊ณ๋ค์ ๋ชจ๋ ์ฐ๊ด ๊ด๊ณ์ด๋ค.
- ์ค์ ๊ด๊ณ๋ฅผ ํ์ ํ ๋๋ ํฉ์ฑ, ์ฐ๊ด ๊ด๊ณ์์ ๊ตฌ๋ถํ๋ ๊ฒ๋ณด๋ค๋ ๊ทธ์ ๊ด๊ณ๊ฐ ์๋ค๋ ๊ฒ์ ์ดํดํ๋ ๊ฒ ์ค์ํ๋ค.
์ด๋ ๊ฒ ์ํํธ์จ์ด๊ฐ ๋์์ผ๋ก ํ๋ ์์ญ์ธ ๋๋ฉ์ธ์ ๋จ์ํํด์ ํํํ ๋ชจ๋ธ์ ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ผ ํ๋ค.
์์ ๊ฒฝ์ฐ, ์ปคํผ ์ ๋ฌธ์ ์ด๋ผ๋ ๋๋ฉ์ธ์ ๋จ์ํํด์ ํํํ ๋ชจ๋ธ์ด๋ค. ๋๋ฉ์ธ์ด๋ผ๋ ๊ฐ๋ ์ ๋ํด ํ์คํ ์ ๋ฆฝํ๋๋ก ํ์.
๋๋ฉ์ธ ๋ชจ๋ธ์ ์ค๊ณํ ๋ ๊ฐ ๊ฐ์ฒด๋ ํ์ ์ผ๋ก ์ถ์ํํด์ผ ํ๋ค. ๋ณต์ก์ฑ์ ๋ฎ์ถ๊ธฐ ์ํจ์ด๋ค.
์ค๊ณํ๊ณ ๊ตฌํํ๊ธฐ
ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ํ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ๋ ํ๋ฅญํ ํ๋ ฅ์ ์ค๊ณํ๋ ๊ฒ์ด๋ค. ํ๋ฅญํ ๊ฐ์ฒด๋ ํ๋ฅญํ ํ๋ ฅ์ ์ค๊ณํ ๋๋ง ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ฅญํ ํ๋ ฅ์ ์ป๊ธฐ ์ํด์๋ ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๋๋ก ํด์ผ ํ๋ค. ๋ฉ์์ง๋ฅผ ๋จผ์ ์ ํํ๊ณ , ๊ทธ ํ ๋ฉ์์ง๋ฅผ ์์ ํ๊ธฐ์ ์ ์ ํ ๊ฐ์ฒด๋ฅผ ์ ํํด์ผ ํ๋ค.
์ปคํผ ์ฃผ๋ฌธ ๋ฉ์์ง
์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ ๊ฒ์ ๋ฉ์์ง๋ก ๋ฝ์๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํ ๊ฐ๋ฅํ๋ค. ๋ฉ์์ง ์์ ๋ถ์ ์ถ๊ฐ ํ์ดํ๋ ๋ฉ์์ง์ ๋ฃ์ ์ธ์๋ฅผ ์๋ฏธํ๋ค.
์ด์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๊ฐ์ฒด๋ฅผ ์ ํํ๋ค. ์ฐ์ ๋๋ฉ์ธ ๋ชจ๋ธ ์์ ์ฑ
์์ ์ํํ๊ธฐ์ ์ ์ ํ ํ์
์ด ์กด์ฌํ๋์ง ์ดํด๋ด์ผ ํ๋ค.
๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ณด๋ฉด ์๋ ํ์
์ ์ธ์คํด์ค๊ฐ ์ ์ ํ๋ค๋ ๊ฒ์ ํ์
ํ ์ ์๋ค.
๋ฉ๋ดํ ์กฐํ ๋ฉ์์ง
์๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋๋ฐ, ํด๋น ๋ฉ๋ด ์ด๋ฆ์ ๋ฉ๋ดํ์์ ์กฐํํด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ฉ๋ด ํญ๋ชฉ์ ๋ํด์๋ ์์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ํ๋ ฅ์ ์ํด ์์ฒญํด์ผ ํ๋ค.
๋ฉ๋ด ํญ๋ชฉ์ ๋ํด ์๊ณ ์๋ ๊ฐ์ฒด๋ ๋ฉ๋ดํ ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ๋ฉ๋ดํ ๊ฐ์ฒด์๊ฒ ์์ฒญํ๋ค.
์ปคํผ ์ ์กฐ ๋ฉ์์ง
์ด์ ์๋์ ๋ฉ๋ด ํญ๋ชฉ์ ์ปคํผ ์ ์กฐ์ ๋๊ฒจ ์ ์กฐ๋ ์ปคํผ๋ฅผ ๋ฐ๋๋ค. ์๋์ด ์ปคํผ ์ ์กฐ๋ฅผ ํ ์๋ ์๊ธฐ ๋๋ฌธ์, ์ ์ ํ ๊ฐ์ฒด์ธ ๋ฐ๋ฆฌ์คํ ๊ฐ์ฒด์๊ฒ ๋ฉ๋ด ํญ๋ชฉ์ ๋ค๊ณ ์์ฒญํ๋ค. ์ดํ ๋ฐ๋ฆฌ์คํ๋ ์ปคํผ๋ฅผ ์ ์กฐํ๋ค.
๊ฐ ๊ฐ์ฒด๋ค์ด ์์ ํ๋ ๋ฉ์์ง๋ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฐ์ ํ๋ค.
์ค์ ๊ฐ๋ฐ
์๋
์ค๊ณ๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ๊ฐ๋ฐ์ ํด ๋ณด์.
์ฒ์์ ์ค๊ณํ ๋๋ก๋ผ๋ฉด, ์๋์ ์ฃผ๋ฌธ์ ํ ๋ ๋ฉ๋ด ์ด๋ฆ์ ํจ๊ป ์ ๋ฌํ๋ค. ์ฆ ์ฝ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
public class Customer {
public void order(String menuName) {
// ๋ด์ฉ
}
}
๊ทธ๋ฐ๋ฐ, ์ฃผ๋ฌธ์ ํ ๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ํ๋ ฅ์ ์์ฒญํ๋ค. ์ฆ ๋ฉ์๋์ ์ธ์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ๋ค์ด๊ฐ์ผ ํ๋ค. ์ด๋ ๊ตฌํ ๋์ค์ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๊ฐ ๋ฌ๋ผ์ง ์ ์์์ ์๋ฏธํ๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.
public class Customer {
public void order(String menuName, Menu menu, Barista barista) {
MenuItem menuItem = menu.choose(menuName);
Coffee coffee = barista.makeCoffee(menuItem);
}
}
๋จธ๋ฆฟ์์ผ๋ก๋ง ๊ตฌ์ํ ์ค๊ณ๋ ์ฝ๋๋ก ๊ตฌํํ๋ ๋จ๊ณ์์ ๋๋ถ๋ถ ๋ณ๊ฒฝ๋๊ธฐ์, ์ค๊ณ์ ๋๋ฌด ์ค๋ ๋จธ๋ฌด๋ฅด์ง ๋ง๊ณ ์ต๋ํ ๋นจ๋ฆฌ ์ฝ๋๋ก ๊ตฌํํ์ฌ ์ค๊ณ๋ฅผ ์ ๊ฒํ๊ณ ๋ณ๊ฒฝํด ๋๊ฐ๋๋ก ํ๋ค.
๋ฉ๋ดํ
๋ฉ๋ดํ์ ์ ๋ฌ๋ฐ์ menuName์ ํด๋น๋๋ MenuItem์ ์ฐพ๋๋ค.
public class Menu {
private List<MenuItem> items;
public Menu(List<MenuItem> items) {
this.items = items;
}
public MenuItem choose(String name) {
for (MenuItem each : items) {
if (each.getName().equals(name)) {
return each;
}
}
return null;
}
}
์ด๋ ์ฃผ์ ๊น๊ฒ ๋ณผ ์ ์, ๊ฐ์ฒด์ ์ธํฐํ์ด์ค (์ธ๋ถ)์์ ์ต๋ํ ๋ด๋ถ ์์ฑ์ธ List <MenuItem>์ ๋ชจ๋ฅด๊ฒ ํ๋ค๋ ์ ์ด๋ค. ๊ฐ์ฒด์ ์ฑ ์์ ๊ฒฐ์ ํ ๋ค, ๊ทธ ์ฑ ์์ ์ํํ๋ ๋ฐ ํ์ํ ์์ฑ์ ๊ฒฐ์ ํ๋๋ก ํ์.
๋ฐ๋ฆฌ์คํ
๋ฐ๋ฆฌ์คํ๋ `menuItem`์ ๊ธฐ๋ฐ์ผ๋ก ์ปคํผ๋ฅผ ๋ง๋ ๋ค.
public class Barista {
public Coffee makeCoffee(MenuItem menuItem) {
Coffee coffee = new Coffee(menuItem);
return coffee;
}
}
์ปคํผ
MenuItem์ ๊ฐ์ ํ ๋๋ก ์ปคํผ๋ฅผ ์์ฑํ๋ค.
public class Coffee {
private String name;
private int price;
public Coffee(MenuItem menuItem) {
this.name = menuItem.getName();
this.price = menuItem.cost();
}
}
๋ฉ๋ด
๊ฐ ๋ฉ๋ด๋ ์ด๋ฆ๊ณผ ๊ฐ๊ฒฉ์ ๊ฐ์ง๋ค.
public class MenuItem {
private String name;
private int price;
public MenuItem(String name, int price) {
this.name = name;
this.price = price;
}
public int cost() {
return price;
}
public String getName() {
return name;
}
}
์ฝ๋์ ์ธ ๊ฐ์ง ๊ด์
์ง๊ธ๊น์ง ์์ฑ๋ ์ฝ๋๋ฅผ ์์ ์ธ ๊ฐ์ง ๊ด์ ์ผ๋ก ๋ฐ๋ผ๋ณด์.
๊ฐ๋ ๊ด์
Customer, Menu, MenuItem, Barista, Coffee ํด๋์ค๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๋ฐ๋ผ์ ์ปคํผ ์ ๋ฌธ์ ๋๋ฉ์ธ์ ๊ตฌ์ฑํ๋ ์ค์ํ ๊ฐ๋
๊ณผ ๊ด๊ณ๊ฐ ๋ฐ์๋์๋ค.
์ํํธ์จ์ด ํด๋์ค๊ฐ ๋๋ฉ์ธ ๊ฐ๋ ์ ํน์ฑ์ ์ต๋ํ ์์ฉํ๋ฉด ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์์ฑ์ ํฅ์ํ ์ ์๋ค.
๋ช ์ธ ๊ด์
๋ช
์ธ ๊ด์ ์ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ผ๋ณธ๋ค๊ณ ํ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ์์ ํ๋ฉด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์์ฒญํ๋ ๊ฐ์ฒด๋ค์๊ฒ ์ ๋ถ ์ํฅ์ด ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ์ ์ต๋ํ ๋ณํ์ ์์ ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด, ๊ตฌํ๊ณผ ๊ด๋ จ๋ ๋ถ๋ถ์ ์จ๊ฒจ์ผ ํ๋ค.
๊ตฌํ ๊ด์
๊ณต์ฉ ์ธํฐํ์ด์ค ์ธ์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉ์๋์ ์์ฑ์ ์ด๋ค์ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋๋ผ๋ ์์น์ ์ผ๋ก ์ธ๋ถ ๊ฐ์ฒด์๊ฒ ์ํฅ์ ์ฃผ์ด์๋ ์ ๋๋ค.
๋ช ์ธ ๊ด์ ์ ํด๋์ค์ ์์ ์ ์ธ ์ธก๋ฉด, ๊ตฌํ ๊ด์ ์ ํด๋์ค์ ๋ถ์์ ํ ์ธก๋ฉด์ ๋๋ฌ๋ด๋๋ก ํ๋ผ.
์์ฝ
- ๊ฐ๋ ๊ด์ ์ ๋๋ฉ์ธ ์์ ์กด์ฌํ๋ ๊ฐ๋ ๊ณผ ๊ฐ๋ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ํํํ๋ค.
- ๋ช ์ธ ๊ด์ ์ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. ๋ฐ๋ผ์ ๋ณํ์ ์์ ์ ์ด์ด์ผ ํ๋ค.
- ๊ตฌํ ๊ด์ ์ ๊ณต์ฉ ์ธํฐํ์ด์ค ์ธ์ ์ธ ๋ถ๋ถ (์ด์ธ์ ๋ฉ์๋, ์์ฑ)์ ๋ฐ๋ผ๋ณธ๋ค. ๋ฐ๋ผ์ ๋ณํ์ ๋ถ์์ ํ๋ค. ๋ณํ๊ฐ ์ผ์ด๋๋๋ผ๋ ์ธ๋ถ ๊ฐ์ฒด์๊ฒ ์ํฅ์ ์ฃผ์ด์๋ ์ ๋๋ค. (์์น์ ์ผ๋ก)
- ์ค๊ณ๋ฅผ ๋น ๋ฅด๊ฒ ํ๊ณ ์ฝ๋๋ก ๊ฒ์ฆํด์ผ ํ๋ค.
- ๊ตฌํ ๋์ค, ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
- ์ฑ ์ ์ค๊ณ ํ ์์ฑ์ ๊ฒฐ์ ํ๋ค.
'๋์ ๐ > ๐ ๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
6์ฅ: ๊ฐ์ฒด ์ง๋ (0) | 2023.11.08 |
---|---|
5์ฅ: ์ฑ ์๊ณผ ๋ฉ์์ง (0) | 2023.11.07 |
4์ฅ: ์ญํ , ์ฑ ์, ํ๋ ฅ (0) | 2023.11.05 |
3์ฅ: ํ์ ๊ณผ ์ถ์ํ (1) | 2023.11.02 |
2์ฅ: ์ด์ํ ๋๋ผ์ ๊ฐ์ฒด (1) | 2023.11.01 |