๋ธ๋ฆฌ์ง ํจํด์ด๋ ๋ฌด์์ ๋๊น?
๋ธ๋ฆฌ์ง ํจํด์ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ๋๋ค. ์ฆ, ์ฃผ์ ์์ ์ ํด๋์ค์ ๊ฐ์ฒด๋ก ์์ ํ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ธ๋ฆฌ์ง๋ ํ๋ ์ด์์ ํด๋์ค๋ฅผ ๋ณ๋์ ๊ณ์ธต( ์ถ์ํ ๋ฐ ๊ตฌํ) ์ผ๋ก ๋๋์ด ์ด๋ฅผ ์ํํฉ๋๋ค . ํ ๊ณ์ธต ๊ตฌ์กฐ์ ๊ธฐ๋ฅ ๋ณ๊ฒฝ์ ๋ค๋ฅธ ๊ณ์ธต์ ๋ณ๊ฒฝ์ ์๋ฐํ์ง ์์ต๋๋ค. ๋ชจ๋ ํ๋ฅญํ์ง๋ง ์ด ์ ์๋ ๋งค์ฐ ๊ด๋ฒ์ํ๋ฉฐ ๊ฐ์ฅ ์ค์ํ ์ง๋ฌธ์ธ "๋ธ๋ฆฌ์ง ํจํด์ด๋ ๋ฌด์์ ๋๊น?"์ ๋ํ ๋ต์ด ์๋๋๋ค. ์ค์ ์ ์ฉ์ ์ดํดํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ ๋ธ๋ฆฌ์ง ํจํด์ ๋ํ ๊ณ ์ ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.Shape
์ผ๋ฐ์ ์ธ ๊ธฐํํ์ ๋ํ์ ๋ํ๋ด๋ ์ถ์ ํด๋์ค๊ฐ ์์ต๋๋ค .
-
๋ชจ์.์๋ฐ
public abstract class Shape { public abstract void draw(); }
์ผ๊ฐํ ๋ฐ ์ง์ฌ๊ฐํ๊ณผ ๊ฐ์ ๋ชจ์์ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ํด๋์ค๋ฅผ ์์ํ๋๋ก ํฉ๋๋ค
Shape
. -
์ง์ฌ๊ฐํ.์๋ฐ:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
์ผ๊ฐํ.์๋ฐ:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
์ด ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ฉ์๋๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌํํ๋ ค๋ฉด draw()
๊ฐ ๋ชจ์-์์ ์กฐํฉ์ ๋ํ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ธ ๊ฐ์ง ์์์ด ์๋ ๊ฒฝ์ฐ TriangleBlack
, TriangleGreen
, TriangleRed
, RectangleBlack
๋ฐ ์ 6๊ฐ ํด๋์ค RectangleGreen
๊ฐ ํ์ํฉ๋๋ค RectangleRed
. 6๊ฐ์ ํด๋์ค๋ ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ํ์ง๋ง! ์๋ก์ด ๋ชจ์์ด๋ ์์์ ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ํด๋์ค ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋ฉ๋๋ค. ์ด ์ํฉ์์ ๋ฒ์ด๋๋ ๋ฐฉ๋ฒ? ํ๋์ ์์์ ์ ์ฅํ๊ณ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ต์
์ ์ด๊ฑฐํ๋ ๊ฒ์ ์ต์์ ์๋ฃจ์
์ด ์๋๋๋ค. ์ข์ ํด๊ฒฐ์ฑ
์ ์์์ ๋ณ๋์ ์ธํฐํ์ด์ค๋ก ์ฎ๊ธฐ๋ ๊ฒ์
๋๋ค.. Color
์ธ ๊ฐ์ง ๊ตฌํ์ด ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. BlackColor
, GreenColor
๋ฐ RedColor
:
-
์์.์๋ฐ:
public interface Color { void fillColor(); }
-
BlackColor.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
Color
์ด์ ํด๋์ค ์ ํ๋๋ฅผ ์ถ๊ฐํฉ๋๋คShape
. ์ฐ๋ฆฌ๋ ์์ฑ์์์ ๊ทธ ๊ฐ์ ์ป์ ๊ฒ์ ๋๋ค. -
๋ชจ์.์๋ฐ:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
์ฐ๋ฆฌ๋ ๊ตฌํ ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋คShape
. ์ด๊ฒ์ ๋ํ์ด ์ด์ ์ธํฐํ์ด์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋คColor
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
๋ ๋ ๊ฐ์ ๊ฐ๋ณ ํด๋์ค ๊ณ์ธต์ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ์
๋๋ค.
๋ธ๋ฆฌ์ง ๊ตฌ์ถ ๋ฐฉ๋ฒ: ์ถ์ํ ๋ฐ ๊ตฌํ
๋ธ๋ฆฌ์ง ํจํด์ ๋ํ๋ด๋ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์์ ์๋ก์ ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์์ ํ ์ ์๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ:- ์ถ์ํ๋
Shape
ํด๋์ค ๋ค Triangle
์ธ๋ จ๋ ์ถ์ํ๋ ๋ฐRectangle
ํด๋์ค ์ ๋๋ค.- ๊ตฌํ์๋
Color
์ธํฐํ์ด์ค ์ ๋๋ค. - ConcreteImplementor๋
BlackColor
,GreenColor
๋ฐRedColor
ํด๋์ค์ ๋๋ค.
Shape
์ ์์ํ๋ ๋ค์ํ ์์์ผ๋ก ๋ํ ์ฑ์ฐ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ธ ์ถ์ํ์
๋๋ค Color
. Triangle
๋ฐ ํด๋์ค ๋ ํด๋์ค Rectangle
์์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ํด๋์ค์
๋๋ค Shape
. BlackColor
, GreenColor
๋ฐ RedColor
๊ตฌํ ๊ณ์ธต ๊ตฌ์กฐ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์
๋๋ค.
๋ธ๋ฆฌ์ง ํจํด์ ์ฌ์ฉํ๋ ์์น
์ด ํจํด์ ์ฌ์ฉํ๋ ํฐ ์ด์ ์ ๋ค๋ฅธ ๊ณ์ธต์ ๋ ผ๋ฆฌ๋ฅผ ์์์ํค์ง ์๊ณ ํ ๊ณ์ธต ๊ตฌ์กฐ์์ ๊ธฐ๋ฅ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ ์ด ์ ๊ทผ ๋ฐฉ์์ ํด๋์ค ๊ฐ์ ๊ฒฐํฉ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ ๋์ ์ฃผ์ ์๊ตฌ ์ฌํญ์ "์ง์นจ์ ๋ฐ๋ฅด์ญ์์ค"์ ๋๋ค. ์ง์นจ์ ๋ฌด์ํ์ง ๋ง์ญ์์ค! ์ด๋ฅผ ์ํด ๋ธ๋ฆฌ์ง ํจํด์ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ์ํฉ์ ํ์ ํด ๋ณด๊ฒ ์ต๋๋ค.-
๋ ๊ฐ์ง ๊ฐ๋ (์: ๋ชจ์ ๋ฐ ์์)์ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ํฐํฐ ์๋ฅผ ํ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ.
-
๋จ์ผ ์ฑ ์ ์์น์ ์ถฉ์กฑํ์ง ์๋ ํฐ ํด๋์ค๋ฅผ ๊ธฐ๋ฅ์ด ์ข์ ์์ ํด๋์ค๋ก ๋๋๋ ค๋ ๊ฒฝ์ฐ.
-
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ ํน์ ์ํฐํฐ์ ๋ ผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ.
-
ํด๋์ค ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๊ตฌํ์ ์จ๊ธธ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ.
ํจํด์ ์ฅ๋จ์
๋ค๋ฅธ ํจํด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ธ๋ฆฌ์ง์๋ ์ฅ์ ๊ณผ ๋จ์ ์ด ๋ชจ๋ ์์ต๋๋ค. ๋ธ๋ฆฌ์ง ํจํด์ ์ฅ์ :- ์ฝ๋์ ํ์ฅ์ฑ์ ํฅ์์์ผ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋ฌด์ธ๊ฐ ์์๋ ์ผ๋ ค ์์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์ํฐํฐ ์๊ฐ ๋ ๊ฐ์ง ๊ฐ๋ (์: ๋ชจ์ ๋ฐ ์์)์ ์กฐํฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฝ์ฐ ํ์ ํด๋์ค ์๋ฅผ ์ค์ ๋๋ค.
- ์ถ์ํ์ ๊ตฌํ์ด๋ผ๋ ๋ ๊ฐ์ ๋ณ๋ ๊ณ์ธต์์ ๊ฐ๋ณ์ ์ผ๋ก ์์ ํ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ๋ ๊ฐ๋ฐ์๊ฐ ์๋ก์ ์ฝ๋๋ฅผ ์์ธํ ์ดํด๋ณด์ง ์๊ณ ๋ ๋ณ๊ฒฝ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์ด๋ ํด๋์ค ๊ฐ์ ๊ฒฐํฉ์ ์ค์
๋๋ค. ๋ ํด๋์ค๊ฐ ๊ฒฐํฉ๋๋ ์ ์ผํ ์ฅ์๋ ๋ธ๋ฆฌ์ง(์: ํ๋
Color color
)์ ๋๋ค.
- ํน์ ์ํฉ๊ณผ ํ๋ก์ ํธ์ ์ ์ฒด ๊ตฌ์กฐ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค(์: ๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํด์ผ ํ๋ ๊ฒฝ์ฐ).
- ๋ ํด๋์ค ์ฌ์ด๋ฅผ ์ ํํด์ผ ํ๋ฏ๋ก ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ค.