
1. ๋์์ธ ํจํด์ด๋?
๋์์ธ ํจํด(design pattern)์ ์ํํธ์จ์ด ์ค๊ณ์์
์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํด ์ฌ์ฌ์ฉํ ์ ์๋ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ์ ํํํ ๊ฒ์ด๋ค
๋ค์ ๋งํด, ๋ฌธ์ ์ํฉ(Context)๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ์ฌ๋ฌ ์ ์ฝ ์กฐ๊ฑด(Problem),
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํด๊ฒฐํ๋ ์ผ๋ฐ์ ์ธ ์ค๊ณ ํด๋ฒ(Solution)์ผ๋ก ๊ตฌ์ฑ๋๋ค.
๋์์ธ ํจํด์ ํน์ ๊ตฌํ ๋ฐฉ๋ฒ์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์กดํ์ง ์์ผ๋ฉฐ
๋ค์ํ ์ํฉ์ ์ ์ฉ๋ ์ ์๋ ์ผ์ข ์ ์ค๊ณ ํ ํ๋ฆฟ์ด๋ค.
"๋ฐํด๋ฅผ ๋ค์ ๋ฐ๋ช ํ์ง ๋ง๋ผ"๋ ๊ฒฉ์ธ์ฒ๋ผ, ์ด๋ฏธ ๊ฒ์ฆ๋ ์ค๊ณ ๋ฐฉ์์ ํ์ฉํจ์ผ๋ก์จ
๊ฐ๋ฐ์๋ ๋งค๋ฒ ์ฒ์๋ถํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ์ ์์ด ํจ์จ์ ์ธ ํด๋ฒ์ ์ ์ฉํ ์ ์๋ค.
์ด๋ฌํ "๋์์ธ ํจํด" ๊ฐ๋ ์ ์๋ ๊ฑด์ถ ๋ถ์ผ์์ ๊ฑด์ถ๊ฐ ํฌ๋ฆฌ์คํ ํผ ์๋ ์ฐ๋๊ฐ ์ ์ํ ์์ด๋์ด์์ ์ถ๋ฐํ๋ค
์ํํธ์จ์ด ๊ฐ๋ฐ ์์ญ์์๋ ์ด ๊ฐ๋ ์ ๋์ ํ์ฌ, ๊ธฐ์กด์ ์ ์ค๊ณ๋ ์ฝ๋์ ํ์ ์ฌํ์ฉํจ์ผ๋ก์จ
ํจ์จ์ ์ด๊ณ ํ์ง ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๋ฐ์ ์์ผฐ๋ค.
๋์์ธ ํจํด์ ๊ตฌ์ฒด์ ์ธ ์ฝ๋ ์กฐ๊ฐ์ด๋ผ๊ธฐ๋ณด๋ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํด๋์ค ๊ตฌ์กฐ์
๊ฐ์ฒด ์ํธ์์ฉ์ ๊ดํ ์ฒญ์ฌ์ง(blueprint)์ด๋ผ๊ณ ํ ์ ์๋ค.
2. ๋์์ธ ํจํด์ด ํ์ํ ์ด์
๋์์ธ ํจํด์ ํ์ฉํ๋ฉด ์ฝ๋์ ํ์ง๊ณผ ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.
์ด๋ฏธ ๋ง์ ์ฌ๋ก๋ฅผ ํตํด ๊ฒ์ฆ๋ ์ค๊ณ ๋ฐฉ์์ ๋ฐ๋ฆ์ผ๋ก์จ ์ป์ ์ ์๋ ๋ํ์ ์ธ ์ด์ ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ์ฌ์ฌ์ฉ์ฑ:
๊ฒ์ฆ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ๋ฌ ํ๋ก์ ํธ๋ ๋ชจ๋์์ ๋ฐ๋ณต ํ์ฉํ ์ ์์ด ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๊ณ ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถํ๋ค.
2. ์ ์ง๋ณด์์ฑ:
์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ช ํํ๊ณ ์ผ๊ด๋๊ฒ ์ค๊ณ๋์ด ๋ณ๊ฒฝ๊ณผ ํ์ฅ์ด ์ฉ์ดํ๋ค.
์ด๋ ์ฝ๋ ์์ ์ ์ค๋ฅ ๋ฐ์์ ์ค์ด๊ณ , ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์์ํ๊ฒ ํ๋ค.
3.์ ์ฐ์ฑ:
๊ฐ์ฒด์งํฅ์ ์์น(์: ๋์จํ ๊ฒฐํฉ๊ณผ ์บก์ํ)์ ์ ์ ์ฉํ ํจํด๋ค์ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๋ค.
๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ง๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๊ธฐ๋ฅ ๋ณ๊ฒฝ ์ ์ํฅ ๋ฒ์๋ฅผ ์ต์ํํ๋ค.
4. ํ์ฅ์ฑ:
์ค๊ณ ๋จ๊ณ์์ ๋ฏธ๋์ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ์ฌ,
์์คํ ์ด ์ปค์ ธ๋ ๊ตฌ์กฐ๋ฅผ ํด์น์ง ์๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋ง์ ์ฌ์ฉ์๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋์ ๋ฌด๋ฆฌ ์์ด ๊ฐ๋นํ ์ ์๋ค.
๋ํ ๋์์ธ ํจํด์ ๊ฐ๋ฐ์๋ค ์ฌ์ด์ ๊ณตํต๋ ์ค๊ณ ์ฉ์ด๋ฅผ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด "Observer ํจํด์ ์ ์ฉํ๋ค"๋ผ๊ณ ํ๋ฉด ์ฝ๋ ๊ตฌ์กฐ์ ์๋๋ฅผ ์ฝ๊ฒ ์ ๋ฌํ ์ ์์ด,
ํ์ ๊ฐ ์์ฌ์ํต์ด ์ํํด์ง๋ค. ์ด์ฒ๋ผ ํจํด์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ถ์ ๋ ์ง์์ผ๋ก์,
์ด๋ณด ๊ฐ๋ฐ์์๊ฒ๋ ๊ฒ์ฆ๋ ์ค๊ณ ๊ธฐ๋ฒ์ ์ ์ฉํ ์ ์๋ ๊ธธ์ก์ด ์ญํ ์ ํ๋ค.
3. ๋์์ธ ํจํด์ ๋ถ๋ฅ
๋์์ธ ํจํด์ ๊ทธ ๋ชฉ์ ๊ณผ ํน์ฑ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ง๋ก ๋ถ๋ฅ๋ ์ ์๋ค.
ํนํ 1994๋ ์๋ฆฌํ ๊ฐ๋ง(Erich Gamma) ๋ฑ์ ํฌํจํ ์ด๋ฅธ๋ฐ
GoF(Gang of Four)์ ์ํด ์ ๋ฆฌ๋ 23๊ฐ์ ๋์์ธ ํจํด๋ค์
ํฌ๊ฒ ์์ฑ(Creational) ํจํด, ๊ตฌ์กฐ(Structural) ํจํด, ํ์(Behavioral) ํจํด์ ์ธ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋๋ค.
๊ฐ ๋ถ๋ฅ์ ๊ฐ๋ ์ ๋ค์๊ณผ ๊ฐ๋ค:
์์ฑ ํจํด(Creational Pattern):
๊ฐ์ฒด ์์ฑ ๋ฐฉ์๊ณผ ๊ด๋ จ๋ ํจํด์ผ๋ก,
๊ฐ์ฒด ์์ฑ ๊ณผ์ ์ ์บก์ํํ์ฌ ํน์ ๊ฐ์ฒด ์์ฑ ๋ณํ๊ฐ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๊ณ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
๊ตฌ์กฐ ํจํด(Structural Pattern):
ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์กฐํฉํด ๋ ํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ํจํด์ด๋ค.
์๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ์ง๋ ๋ ๊ฐ์ฒด๋ฅผ ๋ฌถ์ด ๋จ์ผ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ฑฐ๋
๊ฐ์ฒด๋ค์ ์๋ก ๋ฌถ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฐฉ์ ๋ฑ์ด ์ด์ ํฌํจ๋๋ค.
ํ์ ํจํด(Behavioral Pattern):
๊ฐ์ฒด๋ ํด๋์ค ์ฌ์ด์ ํจ์จ์ ์ธ ์ํธ์์ฉ์ด๋ ์ญํ ๋ถ๋ด๊ณผ ๊ด๋ จ๋ ํจํด์ด๋ค.
ํ ๊ฐ์ฒด๊ฐ ํผ์ ์ํํ๊ธฐ ์ด๋ ค์ด ์์ ์ ์ฌ๋ฌ ๊ฐ์ฒด์ ๋๋์ด ์ฒ๋ฆฌํ๋ฉด์,
๊ฐ์ฒด๋ค ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ์ต์ํํ๋ ๋ฐ ์ค์ ์ ๋๋ค.
์ด ์ธ ๊ฐ์ง ๋ถ๋ฅ ์ฒด๊ณ๋ ๋์์ธ ํจํด์ ์ดํดํ๊ณ ์กฐ์งํํ๋ ๋ฐ ๋๋ฆฌ ํ์ฉ๋๋ฉฐ,
์ฐ๋ฆฌ๊ฐ ๊ณง ์ดํด๋ณผ ๊ฐ๋ณ ํจํด๋ค๋ ์ด ์ธ ๋ฒ์ฃผ ์ค ํ๋์ ์ํ๋ค.
4. ์ฃผ์ ๋์์ธ ํจํด ์ดํด๋ณด๊ธฐ
1. ์์ฑ ํจํด (Creational Patterns)
์์ฑ ํจํด์ ๊ฐ์ฒด์ ์์ฑ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๋ ํจํด๋ค๋ก,
๊ฐ์ฒด ์์ฑ ๋ก์ง์ ์บก์ํํ์ฌ ์ ์ฐํ ๊ฐ์ฒด ์์ฑ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
๋ํ์ ์ธ ์์ฑ ํจํด์๋ ์ฑ๊ธํด, ํฉํ ๋ฆฌ ๋ฉ์๋, ์ถ์ ํฉํ ๋ฆฌ, ๋น๋, ํ๋กํ ํ์ ๋ฑ์ด ์๋ค.
์๋์์ ๊ฐ ํจํด์ ๊ตฌ์กฐ์ ํ์ฉ ๋ฐฉ๋ฒ์ ์์๋ณธ๋ค.
1) ์ฑ๊ธํด(Singleton) ํจํด
์ฑ๊ธํด ํจํด์ ํน์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ค์ง ํ๋๋ง ์์ฑํ๊ณ ,
์ด๋์๋ ์ง ๊ทธ ์ ์ผํ ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ ํจํด์ด๋ค.
์ฃผ๋ก ์ ์ญ์ ์ผ๋ก ๊ณต์ ๋๋ ๋ฆฌ์์ค(์: ์ค์ ์ ๋ณด, ๋ก๊ทธ ์ฒ๋ฆฌ ๊ฐ์ฒด ๋ฑ)์ ์ฌ์ฉ๋๋ฉฐ,
ํ๋์ ๊ฐ์ฒด๋ง ํ์ํ ๋ ์ ์ฉํ๋ค.
๊ตฌ์กฐ์ ์ผ๋ก๋ ์์ฑ์๋ฅผ private์ผ๋ก ๊ฐ์ถ๊ณ ,
ํด๋์ค ๋ด๋ถ์ ์๊ธฐ ์์ ์ ์ ์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ์ฌ ์ ๊ณตํ๋ ์์ผ๋ก ๊ตฌํํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๊ณณ์์ new๋ก ์ธ์คํด์ค๋ฅผ ์ถ๊ฐ ์์ฑํ์ง ๋ชปํ๊ณ ,
์ ํด์ง ๊ณณ์ ํตํด์๋ง ๊ฐ์ฒด๋ฅผ ์ป๋๋ก ๊ฐ์ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ํ๋๋ง ์กด์ฌํด์ผ ํ๋ ์ค์ ๋งค๋์ ๋ฅผ ์ฑ๊ธํด์ผ๋ก ๊ตฌํํ์ฌ
์ด๋์๋ ๋์ผํ ์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค.
2) ํฉํ ๋ฆฌ ๋ฉ์๋(Factory Method) ํจํด
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ๊ฐ์ฒด ์์ฑ ์ฒ๋ฆฌ๋ฅผ ์๋ธํด๋์ค๋ก ๋ถ๋ฆฌํ๋ ๋์์ธ ํจํด์ด๋ค.
์ฆ, ์์ ํด๋์ค(๋๋ ์ธํฐํ์ด์ค)์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ถ์ ๋ฉ์๋(Factory ๋ฉ์๋)๋ฅผ ์ ์ํ๊ณ ,
์ค์ ๊ฐ์ฒด ์์ฑ ๊ณผ์ ์ ์ด๋ฅผ ๊ตฌํํ ํ์ ํด๋์ค์์ ๊ฒฐ์ ํ๋๋ก ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฒด ์์ฑ ์ฝ๋์ ์ฌ์ฉ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ,
์์ฑ ๋ฐฉ์์ ๋ณ๊ฒฝ์ด ์์ ๋๋ ์์ ๊ณ์ธต์ ์ฝ๋ ์์ ์ ์ต์ํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๊ฒ์์์ Enemy๋ผ๋ ์ถ์ ํด๋์ค๊ฐ ์๊ณ ์ด๋ฅผ ์์๋ฐ์ Goblin, Dragon ๋ฑ์ด ์์ ๋,
ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํตํด ๊ฒ์ ๋ ๋ฒจ์ ๋ฐ๋ผ ๋ค์ํ Enemy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๊ตฌํํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ง ํ๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์๊ด์์ด ์ ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค.
3) ์ถ์ ํฉํ ๋ฆฌ(Abstract Factory) ํจํด
์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๊ด๋ จ์ฑ ์๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํจํด์ด๋ค.
์๋ก ์ฐ๊ด๋ ๊ฐ์ฒด๋ค์ ์ ํ๊ตฐ(Family)์ ํ๊บผ๋ฒ์ ๋ง๋ค์ด์ฃผ๋ ๊ณต์ฅ์ ์ถ์ํํ ๊ฒ์ผ๋ก,
๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์ง์ ์์กดํ์ง ์๊ณ ๋ ํธํ์ฑ ์๋ ๊ฐ์ฒด๋ค์ ์์ฐํ ์ ์๋ค.
๊ตฌ์กฐ์ ์ผ๋ก๋ ์ฌ๋ฌ ๊ฐ์ ์ถ์ ํฉํ ๋ฆฌ ์ธํฐํ์ด์ค์ ๊ตฌ์ฒด ํฉํ ๋ฆฌ ํด๋์ค๋ค์ด ์์ผ๋ฉฐ,
๊ฐ๊ฐ์ ๊ตฌ์ฒด ํฉํ ๋ฆฌ๋ ํน์ ์ ํ๊ตฐ์ ์์ฐํ๋ ์ญํ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ๋ ์ถ์ ํฉํ ๋ฆฌ ์ธํฐํ์ด์ค๋ง ์๊ณ , ๊ตฌ์ฒด ํฉํ ๋ฆฌ๋ฅผ ์ ํํจ์ผ๋ก์จ ๊ด๋ จ๋ ๊ฐ์ฒด๋ค์ ์์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, GUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์๋ก ์ด์ธ๋ฆฌ๋ ์คํ์ผ์ ๋ฒํผ, ํ ์คํธํ๋, ์ฒดํฌ๋ฐ์ค๋ฅผ ์์ฑํ ๋
์ถ์ ํฉํ ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด, "์๋์ฐ ์คํ์ผ ์์ ฏ ํฉํ ๋ฆฌ", "๋ฆฌ๋ ์ค ์คํ์ผ ์์ ฏ ํฉํ ๋ฆฌ" ๋ฑ์ ํตํด
ํ ๋ฒ์ ํธ์ถ๋ก ์ผ๊ด๋ GUI ์ปดํฌ๋ํธ ์ธํธ๋ฅผ ์ป์ ์ ์๋ค.
Abstract Factory ํจํด์ UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ.
์๋ก ๊ด๋ จ๋ ์ ํ๊ตฐ(ProductA์ ProductB)์ ๋ํด ์ถ์ ํฉํ ๋ฆฌ(AbstractFactory)๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ ํ๊ณ ,
๊ฐ ๊ตฌ์ฒด ํฉํ ๋ฆฌ(ConcreteFactory)๊ฐ ์ฐ๊ด๋ ์ ํ ๊ฐ์ฒด๋ค์ ์์ฑํ๋ค.
4) ๋น๋(Builder) ํจํด
๋น๋ ํจํด์ ๋ณต์กํ ๊ฐ์ฒด์ ์์ฑ ๊ณผ์ ๊ณผ ํํ ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํ์ฌ,
๋์ผํ ์์ฑ ์ ์ฐจ์์ ์๋ก ๋ค๋ฅธ ํํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ํจํด์ด๋ค.
์ฆ, ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ ๋จ๊ณ(๋ถํ ์กฐ๋ฆฝ ๋จ๊ณ)๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ฐํ๊ฒ ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ํ๋ค.
๊ตฌ์กฐ๋ ์ ํ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ Builder ์ถ์ ํด๋์ค(๋๋ ์ธํฐํ์ด์ค)์ ์ด๋ฅผ ๊ตฌํํ Concrete Builder๋ค,
๊ทธ๋ฆฌ๊ณ ๊ฑด์ถ ๊ฐ๋ ๊ฒฉ์ธ Director๊ฐ ์กด์ฌํ๋ค.
Director๋ Builder ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ์์๋๋ก ๋น๋์๊ฒ ์ง์๋ฅผ ๋ด๋ฆฌ๊ณ ,
์ต์ข ์ ์ผ๋ก ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ๋๋ค.
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๊ฐ์ฒด ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ฐ๊พธ๋๋ผ๋ Builder ๊ตฌํ๋ง ๊ต์ฒดํ๋ฉด ๋๋ฏ๋ก,
์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋์์ง๋ค.
์ค์ ์ฌ๋ก๋ก ๋ณต์กํ ๋ฌธ์ ์์ฑ๊ธฐ์์ Builder๋ฅผ ํ์ฉํ์ฌ
HTML, PDF ๋ฑ ์๋ก ๋ค๋ฅธ ํฌ๋งท์ ๋ฌธ์๋ฅผ ์์ฑํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๋ Builder๋ฅผ ์ ํํ๊ณ Director์๊ฒ ์์ ์ ๋งก๊ธฐ๋ฉด
์ผ๋ จ์ ๊ณผ์ ํ ์ํ๋ ํํ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ป์ ์ ์๋ค.
5) ํ๋กํ ํ์ (Prototype) ํจํด
ํ๋กํ ํ์ ํจํด์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ ํจ์ผ๋ก์จ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด์ด๋ค.
์ง์ new๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋์ , ์ํ์ด ๋๋ ๊ฐ์ฒด(Prototype)๋ฅผ ๋ฏธ๋ฆฌ ํ๋ ๋ง๋ค์ด ๋๊ณ
ํ์ํ ์์ ์ ์ด๋ฅผ ๋ณต์ฌ(clone)ํ์ฌ ์ฌ์ฉํ๋ค.
์ด๋ฌํ ๋ฐฉ์์ ๊ฐ์ฒด ์์ฑ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ(์: ๋ณต์กํ ์ด๊ธฐํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ ๊ฐ์ฒด)๋
๊ฐ์ฒด์ ์ข ๋ฅ๊ฐ ๋๋ฌด ๋ง์ ํด๋์ค๋ก ๋ชจ๋ ์ ์ํ๊ธฐ ์ด๋ ค์ธ ๋ ์ ์ฉํ๋ค.
ํ๋กํ ํ์ ํจํด์ ๊ตฌํํ๋ ค๋ฉด ๋ณต์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ธํฐํ์ด์ค(Cloneable ๋ฑ)๋ฅผ ํ์ฉํ๊ฑฐ๋,
๊ฐ์ฒด ์ค์ค๋ก๊ฐ ์๊ธฐ ๋ณต์ ๋ฅผ ์ํํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ฒ ํ๋ค.
๋ณต์ ์ ์์ ๋ณต์ฌ(shallow copy)์ ๊น์ ๋ณต์ฌ(deep copy)๋ฅผ ์ ์ ํ ์ ํํด์ผ ํ๋ฉฐ,
๋ณต์ ๋ ๊ฐ์ฒด๋ฅผ ์๋ณธ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
ํ๋กํ ํ์ ํจํด์ ์๋ก, ๊ฒ์์์ ๋ค์ํ ๋ชฌ์คํฐ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ ๋ชฌ์คํฐ ๊ฐ์ฒด ํ๋๋ฅผ ๋ง๋ค์ด ๋๊ณ
์ํ๋ง ๋ณ๊ฒฝํ์ฌ ๋ณต์ ํจ์ผ๋ก์จ ์ฑ๋ฅ์ ๋์ด๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ ์๋ค.
2. ๊ตฌ์กฐ ํจํด (Structural Patterns)
๊ตฌ์กฐ ํจํด์ ๊ฐ์ฒด๋ ํด๋์ค๋ค์ ์กฐํฉํ์ฌ ๋ ํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ํจํด๋ค๋ก,
๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๋ฅผ ์กฐ์งํํ๊ณ ์ธํฐํ์ด์ค๋ฅผ ๋จ์ํํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๋ค.
๋ํ์ ์ธ ๊ตฌ์กฐ ํจํด์๋ ์ด๋ํฐ, ๋ธ๋ฆฌ์ง, ์ปดํฌ์งํธ, ๋ฐ์ฝ๋ ์ดํฐ, ํผ์ฌ๋, ํ๋ผ์ด์จ์ดํธ, ํ๋ก์ ํจํด ๋ฑ์ด ์๋ค.
1) ์ด๋ํฐ(Adapter) ํจํด
์ด๋ํฐ ํจํด์ ํธํ๋์ง ์๋ ๋ ๊ฐ๋ ์ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ด์ฃผ๋ ์ค๊ฐ ๋ณํ๊ธฐ ์ญํ ์ ํ๋ ํจํด์ด๋ค.
๊ธฐ์กด ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํด๋ผ์ด์ธํธ์์ ๊ธฐ๋ํ๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ก ๋ณํํ์ฌ,
์ธํฐํ์ด์ค ๋ถ์ผ์น๋ก ํจ๊ป ๋์ํ์ง ๋ชปํ๋ ํด๋์ค๋ค์ด ํ๋ ฅํ ์ ์๊ฒ ํด์ค๋ค.
๊ตฌ์กฐ๋ ๋์(Target) ์ธํฐํ์ด์ค์ ์ด๋ฅผ ๊ตฌํํ๋ ์ด๋ํฐ(Adapter) ํด๋์ค,
๊ทธ๋ฆฌ๊ณ ์ด๋ํฐ๊ฐ ํธํ์ํค๊ณ ์ ํ๋ ์ ์๋ ํด๋์ค(Adaptee)๋ก ๊ตฌ์ฑ๋๋ค.
ํ์ค ์ธ๊ณ์ ์๋ก, ์ ๊ธฐ ์ฝ์ผํธ์ ํ๋ฌ๊ทธ ํํ๊ฐ ๋ค๋ฅผ ๋ ์ฌ์ฉํ๋ ๋ผ์ง์ฝ ์ด๋ํฐ๋ฅผ ๋ ์ฌ๋ฆด ์ ์๋ค.
์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋
์๋ก์ด ์ธํฐํ์ด์ค์ ๋ง์ถฐ ์ฌ์ฉํ ์ ์์ด, ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ด ๋์์ง๋ค.
2) ๋ธ๋ฆฌ์ง(Bridge) ํจํด
๋ธ๋ฆฌ์ง ํจํด์ ์ถ์ํ(Abstraction)์ ๊ตฌํ(Implementation)์ ๋ถ๋ฆฌํ์ฌ
๋ ์์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์๊ฒ ํด์ฃผ๋ ํจํด์ด๋ค.
์ฆ, ๊ธฐ๋ฅ ๊ณ์ธต๊ณผ ๊ตฌํ ๊ณ์ธต์ ๋ฐ๋ก ๋ง๋ค์ด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ฐ ๊ด๋ฆฌํ๊ณ , ๋ฐํ์์ ์ด๋ค์ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ค.
์ด๋ฅผ ํตํด ํ๋์ ๊ณ์ธต์ ๋ณ๊ฒฝ์ด ๋ฐ์ํด๋ ๋ค๋ฅธ ๊ณ์ธต์ ์ํฅ์ ์ฃผ์ง ์์ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋๋ค.
๊ตฌ์กฐ์ ์ผ๋ก๋ ์ถ์ ํด๋์ค๊ฐ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํํ๋ก ์ฐ๊ฒฐ๋๋ฉฐ,
๊ตฌํ๋ถ ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ก์ด ๊ตฌํ์ ๋์ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๊ทธ๋ํฝ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ฝ๋์์ "ํ๋ฉด ํํ"์ ๋ด๋นํ๋ ๋ถ๋ถ๊ณผ
"์ถ๋ ฅ ์ฅ์น"์ ๋ํ ๋ถ๋ถ(์: ๋ชจ๋ํฐ, ํ๋ฆฐํฐ ๋ฑ)์ ๋ธ๋ฆฌ์ง๋ก ๋ถ๋ฆฌํ๋ฉด,
์ถ๋ ฅ ์ฅ์น๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ต์ฒดํด๋ ํ๋ฉด ํํ ๋ก์ง์ ์์ ํ ํ์๊ฐ ์๋ค.
3) ์ปดํฌ์งํธ(Composite) ํจํด
์ปดํฌ์งํธ ํจํด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌ(tree) ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ถ๋ถ-์ ์ฒด ๊ณ์ธต์ ๊ตฌํํ๋ ํจํด์ด๋ค.
์ด๋ฅผ ํตํด ๋จ์ผ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ผ๊ด๋๊ฒ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค๋ค.
์ปดํฌ์งํธ ํจํด์ ๊ตฌ์กฐ์์๋ ๊ณตํต๋ ์ถ์ ๊ตฌ์ฑ ์์(Component)๊ฐ ์๊ณ ,
๋ฆฌํ(Leaf) ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํ๋ ์ปดํฌ์งํธ(Composite) ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค.
Composite ๊ฐ์ฒด๋ ์์ ์ ์์๋ค์ ๊ด๋ฆฌํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์์๋ค์๊ฒ ์ ๋ฌํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ทจํฉํ๋ค.
์ด ํจํด์ ์ฌ์ฉํ๋ฉด ํด๋-ํ์ผ๊ณผ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃฐ ์ ์๋๋ฐ,
์์ปจ๋ ํด๋ ์์ ํด๋์ ํ์ผ์ด ๋ค์ด์๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ปดํฌ์งํธ ํจํด์ผ๋ก ๊ตฌํํ๋ฉด
ํด๋์ ํ์ผ์ ๋์ผํ ์ธํฐํ์ด์ค๋ก ์ฒ๋ฆฌํ ์ ์์ด ์ฝ๋๊ฐ ๋จ์ํด์ง๋ค.
4) ๋ฐ์ฝ๋ ์ดํฐ(Decorator) ํจํด
๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ์(decorate) ์๋ก์ด ํ์๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ,
๋ฐํ์์ ๋์ ์ผ๋ก ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๊ฒ ํด์ฃผ๋ ํจํด์ด๋ค.
์์์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ถ๊ฐ ์ฑ ์์ ๋ถ์ฌํ๊ธฐ ์ฝ๊ณ ,
์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ค์ฒฉํ์ฌ ๋ณตํฉ์ ์ธ ๊ธฐ๋ฅ ํ์ฅ๋ ๊ฐ๋ฅํ๋ค.
๊ตฌ์กฐ์ ์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ๋ ์๋ณธ ๊ฐ์ฒด(Component ์ธํฐํ์ด์ค ๊ตฌํ์ฒด)๋ฅผ ํฌํจ(composition)ํ๊ณ ์์ผ๋ฉฐ,
Component์ ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ค, ๋๋จธ์ง ์์ฒญ์ ๋ด๋ถ์ ์๋ณธ ๊ฐ์ฒด์ ์์ํ์ฌ ์ฒ๋ฆฌํ๋ค.
Decorator ํจํด์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ.
Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ConcreteComponent๊ฐ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ,
Decorator ์ถ์ ํด๋์ค๋ฅผ ํตํด ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ง์์ด๋ค.
์ฌ๋ฌ ๊ฐ์ ConcreteDecorator๊ฐ ์ค์ฒฉ๋์ด ์๋ณธ ๊ฐ์ฒด์ ํ์๋ฅผ ํ์ฅํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์๋ฐ์ InputStream์ ๋ฒํผ๋ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ BufferedInputStream์ด๋,
GUI ์ปดํฌ๋ํธ์ ์คํฌ๋กค๋ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ScrollDecorator ๋ฑ์ด ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ค์ ์ฌ๋ก์ด๋ค.
์ด๋ฌํ ๋ฐฉ์์ ์์์ผ๋ก ๋ค์ํ ๊ธฐ๋ฅ ์กฐํฉ ํด๋์ค๋ฅผ ๋ฌด์ํ ๋ง๋ค ํ์ ์์ด,
ํ์ํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์กฐํฉํ์ฌ ์ ์ฐํ๊ฒ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
5) ํผ์ฌ๋(Facade) ํจํด
ํผ์ฌ๋(Facade) ํจํด์ ๋ณต์กํ ์ฌ๋ฌ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ์์คํ ์ ๋จ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ํจํด์ด๋ค.
์ธ๋ถ์์ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ธ์์คํ ์ ์ฌ์ฉํ ๋,
ํผ์ฌ๋ ๊ฐ์ฒด๊ฐ ์ผ๋ จ์ ๋ณต์กํ ์์ ์ ๋ด๋ถ์์ ์ฒ๋ฆฌํ๊ณ ๊ฐ๋จํ ๋ฉ์๋๋ง ๋ ธ์ถํจ์ผ๋ก์จ ์ฌ์ฉ์ฑ์ ๋์ฌ์ค๋ค.
๊ตฌ์กฐ๋ ํผ์ฌ๋ ํด๋์ค๊ฐ ์์คํ ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ค์ ํ๋๋ก ๊ฐ๊ณ ,
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ๊ฐ์ฒด๋ค์๊ฒ ์์ ์ ์์ํ๋ ์์ด๋ค.
์ด ํจํด์ ํตํด ํด๋ผ์ด์ธํธ ์ฝ๋๋ ๋ณต์กํ ์๋ธ์์คํ ์ ์ธ๋ถ ์ฌํญ์ ๋ชฐ๋ผ๋ ๋๊ณ , ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.
ํ์ค ์ธ๊ณ์ ์๋ก, ํธํ ์ ํผ์ฌ๋ ์ญํ ์ ํ๋ ์ ์์์ด ์ฌ๋ฌ ๋ด๋ถ ์๋น์ค๋ฅผ ๋์ ์ฒ๋ฆฌํ์ฌ
๊ณ ๊ฐ์ ์ ์์์๊ฒ๋ง ์์ฒญํ๋ฉด ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ ์ ์๋ค.
๊ฐ๋ฐ์์ ํํ ๋ณผ ์ ์๋ ์๋ก๋, ์ฌ๋ฌ ๋ชจ๋๋ก ๊ตฌ์ฑ๋ API์ ๋จ์ํ๋ Facade ํด๋์ค๋,
๋ณต์กํ ์ด๊ธฐํ ์ ์ฐจ๋ฅผ ์บก์ํํ ํฌํผ ํด๋์ค ๋ฑ์ด ์๋ค.
6) ํ๋ผ์ด์จ์ดํธ(Flyweight) ํจํด
ํ๋ผ์ด์จ์ดํธ ํจํด์ ๋ง์ ์์ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ผ๋ก ๊ณต์ ํ๊ธฐ ์ํ ํจํด์ด๋ค.
๋ณธ์ง์ ์ผ๋ก ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ค๋ณต์ผ๋ก ์์ฑํ์ง ์๊ณ ,
๊ณตํต๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๋์ธ๋ค.
๊ตฌ์กฐ๋ ํ๋ผ์ด์จ์ดํธ ํฉํ ๋ฆฌ(Flyweight Factory)๊ฐ ๊ฐ์ฒด ํ(pool)์ ๊ด๋ฆฌํ๋ฉด์ ์ด๋ฏธ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ฑฐ๋,
์์ผ๋ฉด ์์ฑํ์ฌ ํ์ ๋ด์๋๋ค.
๊ฐ์ฒด ์ํ๋ฅผ ๋ด์ฌ ์ํ(intrinsic state: ๊ณต์ ๋๋ ์ํ)์ ์ธ์ฌ ์ํ(extrinsic state: ๊ฐ๋ณ ์์ฑ)๋ก ๊ตฌ๋ถํ์ฌ,
๊ณต์ ๋๋ ๋ถ๋ถ๋ง ํ๋ผ์ด์จ์ดํธ ๊ฐ์ฒด์ ๋ด๊ณ ์ธ์ฌ ์ํ๋ ๊ฐ์ฒด ์ฌ์ฉ ์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๊ฒ๋ ํน์ง์ด๋ค.
์๋ฅผ ๋ค์ด, ํ ์คํธ ํธ์ง๊ธฐ์์ ๋ฌธ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋์ผํ ๊ธ์๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ณ ,
๊ธ์์ ์์น๋ ์คํ์ผ๊ณผ ๊ฐ์ ๊ฐ๋ณ ์์ฑ๋ง ๋ฐ๋ก ๊ด๋ฆฌํ๋๋ก ํ๋ฉด ๋ฐฉ๋ํ ํ ์คํธ์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์๋ค.
์ด์ฒ๋ผ ํ๋ผ์ด์จ์ดํธ ํจํด์ ๋๋์ ๊ฐ์ฒด ์์ฑ์ผ๋ก ์ธํ ๋น์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ์ ์ฉํ๋ค.
7) ํ๋ก์(Proxy) ํจํด
ํ๋ก์ ํจํด์ ์ด๋ค ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด ๋๋ฆฌ์ธ(Proxy) ๊ฐ์ฒด๋ฅผ ์์ธ์ฐ๋ ํจํด์ด๋ค.
ํ๋ก์๋ ์ค์ ๊ฐ์ฒด(Real Subject)๋ฅผ ๋์ ํ์ฌ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ํ์์ ๋ฐ๋ผ ์ค์ ๊ฐ์ฒด์ ์์ฒญ์ ์ ๋ฌํ๋ค.
์ด ๋ ํ๋ก์๋ ์ ๊ทผ ์ ์ด, ๋ก๊น , ์บ์ฑ ๋ฑ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค.
๊ตฌ์กฐ์ ์ผ๋ก Subject ์ธํฐํ์ด์ค๋ฅผ ์ค์ ๊ฐ์ฒด์ ํ๋ก์๊ฐ ๊ณต์ ํ๋ฉฐ,
ํด๋ผ์ด์ธํธ๋ ์ค์ ๊ฐ์ฒด ๋์ ํ๋ก์์ ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
ํ๋ก์์ ์ ํ์๋ ๊ฐ์ ํ๋ก์(์ค์ ๊ฐ์ฒด ์์ฑ์ ์ง์ฐํ์ฌ ์ฑ๋ฅ ํฅ์),
๋ณดํธ ํ๋ก์(์ ๊ทผ ๊ถํ์ ์ ์ด), ์๊ฒฉ ํ๋ก์(๋ค๋ฅธ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ฒด์ ํต์ ) ๋ฑ์ด ์๋ค.
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ฐ์ฒด์ ํ๋ก์๋ฅผ ๋ง๋ค์ด ์ค์ ์ฟผ๋ฆฌ ์คํ ์ ์ ์ฐ๊ฒฐ ํ์์ ์ฐ๊ฒฐ์ ๊ฐ์ ธ์ค๊ฑฐ๋,
์๊ฒฉ ์๋น์ค ํธ์ถ์ ๋ก์ปฌ ํ๋ก์๋ก ์ ๊ณตํ์ฌ ๋คํธ์ํฌ ํต์ ์ ์บก์ํํ๋ ๊ฒฝ์ฐ ๋ฑ์ ํ์ฉ๋๋ค.
ํ๋ก์ ํจํด์ ์ฌ์ฉํ๋ฉด
์ค์ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ ๋ก์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ๋ค์ํ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
3. ํ์ ํจํด (Behavioral Patterns)
ํ์ ํจํด์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๊ฐ์ฒด ๊ฐ ํต์ ๋ฑ ๊ฐ์ฒด๋ค์ ์ํธ์์ฉ๊ณผ ์ฑ ์ ๋ถ๋ฐฐ์ ๊ด๋ จ๋ ๋์์ธ ํจํด๋ค์ด๋ค.
์ฃผ์ ํ์ ํจํด์ผ๋ก๋ ์ฑ ์ ์ฐ์, ์ปค๋งจ๋, ์ธํฐํ๋ฆฌํฐ, ์ดํฐ๋ ์ดํฐ, ๋ฏธ๋์์ดํฐ, ๋ฉ๋ฉํ , ์ต์ ๋ฒ, ์ํ, ์ ๋ต, ํ ํ๋ฆฟ ๋ฉ์๋, ๋ฐฉ๋ฌธ์ ํจํด ๋ฑ์ด ์๋ค.
1) ์ฑ ์ ์ฐ์(Chain of Responsibility) ํจํด
์ฑ ์ ์ฐ์ ํจํด์ ํ๋์ ์์ฒญ์ ๋ ์ด์์ ๊ฐ์ฒด๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ๋๊ณ ,
์์ฒญ์ ๋ฐ๋ ๊ฐ์ฒด๋ค์ ์ฐ์ ํํ๋ก ๋ฌถ์ด ์์ฐจ์ ์ผ๋ก ์ ๋ฌํ๋ ํจํด์ด๋ค.
์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ธฐํ๋ฅผ ์ฒด์ธ์ ์ฐ๊ฒฐ๋ ๊ฐ ๊ฐ์ฒด๊ฐ ์์๋๋ก ๊ฐ๊ฒ ๋๋ฉฐ, ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋งก์ผ๋ฉด ์ฒด์ธ์ด ์ข ๋ฃ๋๋ค.
์ด ๋ฐฉ์์ ๋ฐ์ ์์ ์์ ์์ ๊ฒฐํฉ๋๋ฅผ ์ค์ฌ์ฃผ๋ฉฐ, ์ฌ๋ฌ ์ฒ๋ฆฌ ๊ฐ์ฒด ์ค ๋๊ฐ ์ฒ๋ฆฌํ ์ง ๋ชจ๋ฅด๋ ์ํฉ์์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ณ ๊ฐ ์ง์ ์์คํ ์์ ๋ฌธ์ ์ฌํญ์ด ๋ค์ด์ค๋ฉด 1์ฐจ ์ง์์๊ฐ ์ฒ๋ฆฌํ๊ณ ,
ํด๊ฒฐ ๋ชป ํ๋ฉด ์์ ์ง์์์๊ฒ ๋๊ธฐ๋ ๊ณผ์ ์ ์ฑ ์ ์ฐ์๋ก ๊ตฌํํ ์ ์๋ค.
2) ์ปค๋งจ๋(Command) ํจํด
์ปค๋งจ๋ ํจํด์ ์๊ตฌ ์ฌํญ์ ์บก์ํํ์ฌ ์์ฒญ ์์ฒด๋ฅผ ๊ฐ์ฒด๋ก ํํํ๋ ํจํด์ด๋ค.
์คํ๋ ๊ธฐ๋ฅ์ ํด๋์ค๋ก ๋ง๋ค์ด ์ฃผ์ด์ง ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์คํํ ์ ์๋ ์ฌ์ฌ์ฉ์ฑ ๋์ ํธ์ถ์(Invoker)๋ฅผ ์ค๊ณํ ์ ์๋ค.
์ปค๋งจ๋ ๊ฐ์ฒด๋ ์คํ๋ ๊ตฌ์ฒด ๋์(๋ฆฌ์๋ฒ์ ์คํ ๋ฉ์๋)์ ์๊ณ ์์ผ๋ฉฐ,
execute() ๋ฑ์ ๊ณตํต ์ธํฐํ์ด์ค๋ก ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ ๊ตฌ์ฒด์ ์ธ ์คํ ๋ด์ฉ์ ๋ชฐ๋ผ๋ ๋๋ค.
์ด ํจํด์ ์ด์ฉํ๋ฉด ์์ ์ทจ์(undo), ์์ฒญ ์ ์ฅ/ํ์ ๋ฑ์ ๊ธฐ๋ฅ๋ ๊ตฌํํ๊ธฐ ์ฝ๋ค.
์๋ฅผ ๋ค์ด, GUI ๋ฒํผ ํด๋ฆญ ๋์์ ์ปค๋งจ๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด Undo/Redo ๊ธฐ๋ฅ์ ์ง์ํ๊ฑฐ๋,
์์ ๋ด์ญ์ ๊ธฐ๋กํ๋ ๋ก๊น ์์คํ ๋ฑ์ ํ์ฉํ ์ ์๋ค.
3) ์ธํฐํ๋ฆฌํฐ(Interpreter) ํจํด
์ธํฐํ๋ฆฌํฐ ํจํด์ ๊ฐ๋จํ ์ธ์ด ๋๋ ๋ฌธ๋ฒ์ ๋ํ ํด์๊ธฐ๋ฅผ ์ ์ํ๋ ํจํด์ด๋ค.
๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค๋ ํน์ ๋๋ฉ์ธ์ ํนํ๋ ๋ฏธ๋ ์ธ์ด(์: ์ ๊ทํํ์, ์์ ๊ณ์ฐ ๋ฑ)์
๋ฌธ๋ฒ ๊ท์น์ ํด๋์ค๋ก ์ ์ํ๊ณ , ์ ๋ ฅ๋ ๋ฌธ์ฅ์ ํด์(interpret)ํ๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ค.
์ธํฐํ๋ฆฌํฐ ํจํด์์๋ ๋ฌธ๋ฒ์ ๊ฐ ๊ท์น์ ๋ํ๋ด๋ ๊ตฌ์กฐ์ฒด(NonterminalExpression)์ ์ค์ ๊ฐ์ ํํํ๋ ๋ง๋จ ํํ(TerminalExpression) ํด๋์ค๋ค์ด ๊ตฌ์ฑ๋๊ณ , ์ด๋ค๋ก ๊ตฌ์ฑ๋ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ํด์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
์ฌ์ฉ ์๋ก ์ํ ์์ ํ์๋ฅผ ๋ค ์ ์๋๋ฐ, ์์์ BNF ๋ฌธ๋ฒ์ ๋ฐ๋ผ ๊ฐ ์ฐ์ฐ์๋ง๋ค ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ,
์ฃผ์ด์ง ์์์ ํด์ํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
๋ค๋ง ์ธํฐํ๋ฆฌํฐ ํจํด์ ๋ฌธ๋ฒ์ด ๋ณต์กํด์ง์๋ก ํด๋์ค ์๊ฐ ๊ธ์ฆํ ์ ์์ด, ๋น๊ต์ ๋จ์ํ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
4) ์ดํฐ๋ ์ดํฐ(Iterator) ํจํด
์ดํฐ๋ ์ดํฐ ํจํด์ ์งํฉ ๊ฐ์ฒด(์ปฌ๋ ์ )์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ ธ์ถํ์ง ์๊ณ ๋ ๊ทธ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ํจํด์ด๋ค.
์ปฌ๋ ์ ๋ณ๋ก ์๋ก ๋ค๋ฅธ ์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ผ๋, ํ์คํ๋ Iterator ์ธํฐํ์ด์ค(hasNext(), next() ๋ฑ)๋ฅผ ๊ตฌํํจ์ผ๋ก์จ
์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์์๋ค์ ํ์ํ ์ ์๋ค.
์ดํฐ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปฌ๋ ์ ์ ๊ตฌํ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฐ๋ณต ์ฒ๋ฆฌ ๋ก์ง์ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ณ ,
์ฌ๋ฌ ์ข ๋ฅ์ ์ปฌ๋ ์ (๋ฆฌ์คํธ, ํธ๋ฆฌ ๋ฑ)์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃฐ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
Java์ Iterator๋ ํ์ด์ฌ์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ(__iter__, __next__)์ด ์ด๋ฌํ ํจํด์ ํด๋นํ๋ฉฐ,
foreach ๋ฌธ ๋ฑ์ด ๋ด๋ถ์ ์ผ๋ก ์ดํฐ๋ ์ดํฐ ํจํด์ ํ์ฉํ ์ฌ๋ก์ด๋ค.
5) ๋ฏธ๋์์ดํฐ(Mediator) ํจํด
๋ฏธ๋์์ดํฐ ํจํด์ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ด ๋ณต์กํ ์ํธ์์ฉ์ ํ๋ ์ํฉ์์
์ค์ฌ์(Mediator) ๊ฐ์ฒด๊ฐ ํต์ ์ ์กฐ์ ์ ๋งก๋๋ก ํ๋ ํจํด์ด๋ค.
๊ฐ ๊ฐ์ฒด(Colleague)๋ ๋ฏธ๋์์ดํฐ์๋ง ํต์ ํ๊ณ ์๋ก ์ง์ ์ฐธ์กฐํ์ง ์๊ธฐ ๋๋ฌธ์
๊ฐ์ฒด๋ค ๊ฐ์ ์์กด์ฑ์ ์ค์ด๊ณ ๊ด๊ณ๋ฅผ ๋จ์ํํ ์ ์๋ค.
๋ฏธ๋์์ดํฐ๋ ๋๋ฃ ๊ฐ์ฒด๋ค ์ฌ์ด์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ์ ๋ฌํ๊ฑฐ๋,
์ถ๊ฐ ๋ก์ง์ ์ํํจ์ผ๋ก์จ ํ๋ ฅ ์์ ์ ์กฐ์ ํ๋ค.
GUI์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ์ํธ ์์ฉ(์: ์ ๋ ฅ ํผ์์ ํ๋๋ค ๊ฐ์ ํ์ฑ/๋นํ์ฑ ์ ์ด)์ ๋ฏธ๋์์ดํฐ๋ก ๊ตฌํํ๋ฉด,
์ปดํฌ๋ํธ๋ค์ด ์ง์ ์๋ก๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ฏธ๋์์ดํฐ๋ฅผ ํตํด ์ํธ์์ฉํ๊ฒ ํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
6) ๋ฉ๋ฉํ (Memento) ํจํด
๋ฉ๋ฉํ ํจํด์ ๊ฐ์ฒด์ ์ํ๋ฅผ ์บก์ฒํ์ฌ ๋์ค์ ๋ณต์ํ ์ ์๋๋ก ํ๋ ํจํด์ด๋ค.
๊ฐ์ฒด์ ๋ด๋ถ ์ํ ์ ๋ณด๋ฅผ ๋ฉ๋ฉํ (Memento) ๊ฐ์ฒด๋ก ์ ์ฅํด ๋์๋ค๊ฐ, ํ์ ์ ์๋ณธ ๊ฐ์ฒด์ ์ํ๋ฅผ ๊ทธ ์์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ค.
์ด๋ ๋ฉ๋ฉํ ๋ ๊ฐ์ฒด์ ์บก์ํ๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๋๋ก ๋ด๋ถ ์ํ๋ฅผ ์ ์ฅํ์ง๋ง ์ธ๋ถ์๋ ๊ทธ ๋ด์ฉ์ ๊ฐ์ถ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ณดํต Originator(์๋ณธ ๊ฐ์ฒด), Memento, Caretaker(๋ฉ๋ฉํ ๋ณด๊ด์) ์ผ์๋ก ๊ตฌ์ฑ๋๋ฉฐ,
Originator๊ฐ ๋ฉ๋ฉํ ๋ฅผ ๋ง๋ค๊ณ ๋ณต์ํ๋ ์ญํ ์ ํ๋ค.
๋ฉ๋ฉํ ํจํด์ ๋๋๋ฆฌ๊ธฐ(undo) ๊ธฐ๋ฅ์ด๋ ์ํ์ฐฉ์ค ์ง์(์ฒด์ค ๊ฒ์์ ๋๋๋ฆฌ๊ธฐ ๋ฑ)์ ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
์๋ฅผ example, ํ ์คํธ ์๋ํฐ์์ ํธ์ง ๊ธฐ๋ก์ ๋ฉ๋ฉํ ๋ก ์ ์ฅํด๋๋ฉด
์ฌ์ฉ์๊ฐ ์คํ ์ทจ์(undo)๋ฅผ ์์ฒญํ ๋ ๋ง์ง๋ง ์ ์ฅ ์ํ๋ก ๋ณต์ํ ์ ์๋ค.
7) ์ต์ ๋ฒ(Observer) ํจํด
์ต์ ๋ฒ ํจํด์ ํ ๊ฐ์ฒด์ ์ํ ๋ณํ ์, ์์กด์ฑ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์๊ฒ ์๋์ผ๋ก ์๋ฆผ์ด ์ ๋ฌ๋์ด ๊ฐฑ์ ์ด ์ด๋ฃจ์ด์ง๋๋ก ํ๋ ํจํด์ด๋ค. ๊ด์ฐฐ ๋์(Subject)์ด ์๊ณ ๋ค์์ ๊ด์ฐฐ์(Observer)๊ฐ ๋ฑ๋ก๋ ํํ๋ก, Subject์ ์ํ๊ฐ ๋ณํ๋ฉด ๊ฐ๊ฐ์ Observer์๊ฒ ํต์ง(Notification)๊ฐ ๊ฐ์ ๊ฐ์ฒด๋ค์ ์ํ๋ฅผ ๋๊ธฐํํ๋ค. ์ด์ฒ๋ผ ์ผ๋๋ค(1:N) ์์กด ๊ด๊ณ๋ฅผ ๊ด๋ฆฌํจ์ผ๋ก์จ, ๊ฐ์ฒด ์ฌ์ด์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋์จํ ๊ฒฐํฉ์ ๊ตฌํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, GUI ๋ฒํผ(Subject) ํด๋ฆญ ์ ์ฌ๋ฌ ๋ฆฌ์ค๋(Observer) ๊ฐ์ฒด๋ค์ด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ ๋์์ ์ํํ๊ฑฐ๋, ๋ฐ์ดํฐ ๋ชจ๋ธ(Subject)์ ๋ณ๊ฒฝ์ ํ๋ฉด(View)๋ค์ด ๊ฐ์งํ์ฌ ์ ๋ฐ์ดํธํ๋ ๊ตฌ์กฐ๊ฐ ์ต์ ๋ฒ ํจํด์ ํด๋นํ๋ค. ์๋ฐ์ java.util.Observer/Observable(ํ์ฌ๋ Deprecated)์ด๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๊ตฌ์กฐ, C#์ ์ด๋ฒคํธ ๋ธ๋ฆฌ๊ฒ์ดํธ ๋ฑ์ด ๋ํ์ ์ธ ํ์ฉ ์ฌ๋ก๋ค.
8) ์ํ(State) ํจํด
์ํ ํจํด์ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ์ ๋ฐ๋ผ ํ์๊ฐ ๋ณ๊ฒฝ๋๋๋ก ์ค๊ณํ๋ ํจํด์ด๋ค.
๋ณดํต ์ํ๋ฅผ ํํํ๋ ์ฌ๋ฌ ๊ฐ์ ์ํ ํด๋์ค๋ค์ด ์๊ณ ,
์๋ณธ ๊ฐ์ฒด(Context)๊ฐ ํ์ฌ ์ํ๋ฅผ ์ฐธ์กฐํ์ฌ ์์ ์ ๋์์ ์์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
์ฆ, ์ํ๋ฅผ ๊ฐ์ฒดํํ๊ณ ์บก์ํํ์ฌ, ์ํ ์ ํ์ ๋ฐ๋ฅธ ํ์ ๋ณํ๋ฅผ ์ฝ๋ ๋ถ๊ธฐ ์์ด ๊ตฌํํ ์ ์๋ค.
Context๋ ์ํ ๋ณํ๊ฐ ํ์ํ๋ฉด ๋ด๋ถ์ ํ์ฌ ์ํ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ด ํจํด์ ์ํ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ฌธ์ด ๋ง์ ์ฝ๋๋ฅผ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๊ฐ์ ํ๋ ๋ฐ ํจ๊ณผ์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ๋ฌธ์ ํธ์ง๊ธฐ์์ ํธ์ง ๋ชจ๋์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ชจ๋์ ๋ฐ๋ผ ํค ์ ๋ ฅ์ ๋ํ ๋์์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ,
์ํ ํจํด์ผ๋ก ๊ฐ ๋ชจ๋์ ๋์์ ๋ถ๋ฆฌํ์ฌ ๊ตฌํํ ์ ์๋ค.
๋๋ ๊ฒ์ ์บ๋ฆญํฐ๊ฐ 'ํ์์', '๋ถ๋ ธ', '์์ ' ๋ฑ์ ์ํ์ ๋ฐ๋ผ ๊ณต๊ฒฉ๋ ฅ์ด ๋ณํ๊ฑฐ๋ ํ๋์ด ๋ฌ๋ผ์ง๋ ๋ก์ง๋
์ํ ํจํด์ผ๋ก ๊ด๋ฆฌํ๋ฉด ๊น๋ํ๋ค.
9) ์ ๋ต(Strategy) ํจํด
์ ๋ต ํจํด์ ์๋ก ๊ตํ ๊ฐ๋ฅํ ์๊ณ ๋ฆฌ์ฆ(์ ๋ต)๋ค์ ์ ์ํ๊ณ ์บก์ํํ์ฌ,
๋ฐํ์์ ํ์์ ๋ฐ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํด์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจํด์ด๋ค.
๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ ๋,
๊ฐ๊ฐ์ ๋ณ๋ ํด๋์ค(Concrete Strategy)๋ก ๊ตฌํํ๊ณ ๊ณตํต ์ธํฐํ์ด์ค(Strategy)๋ฅผ ์ ์ํ๋ค.
ํด๋ผ์ด์ธํธ๋ ์ ๋ต์ ์ฃผ์ ๋ฐ๊ฑฐ๋ ์ค์ ํจ์ผ๋ก์จ, ์ฝ๋ ์์ ์์ด๋ ์คํ ์ค์ ๋ค๋ฅธ ์ ๋ต์ผ๋ก ๊ต์ฒดํ ์ ์๋ค.
์ด๋ก์จ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ฝ๋์ ๊ตฌํ์ ๋ถ๋ฆฌํ์ฌ ๋ณ๊ฒฝ์ ์ ์ฐํ๊ณ ํ์ฅ์ ์ฉ์ดํ ๊ตฌ์กฐ๋ฅผ ์ป๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ,
SortStrategy ์ธํฐํ์ด์ค ์๋์ QuickSort, MergeSort ๋ฑ์ ๊ตฌํํด ๋๊ณ
๋ฐ์ดํฐ ์์ด๋ ์ํ์ ๋ฐ๋ผ ์ ๋ต ๊ฐ์ฒด๋ฅผ ๋ฐ๊ฟ ๋ผ์ธ ์ ์๋ค.
Strategy ํจํด์ UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ.
Strategy ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฌ๋ฌ ๊ตฌ์ฒด ์ ๋ต(ConcreteStrategyA, ConcreteStrategyB)์ ๊ตํ ๊ฐ๋ฅํ๊ฒ ์ ์ํ๊ณ ,
Context๋ ๋ฐํ์์ ํ๋์ ์ ๋ต์ ์ ํํ์ฌ ์ฌ์ฉํ๋ค.
10) ํ ํ๋ฆฟ ๋ฉ์๋(Template Method) ํจํด
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์ํ๊ณ , ์ผ๋ถ ๋จ๊ณ์ ๊ตฌํ์ ์๋ธํด๋์ค์ ์์ํ๋ ํจํด์ด๋ค.
์ฆ, ์์ ํด๋์ค์ ํ ํ๋ฆฟ์ด ๋๋ ๋ฉ์๋(Template Method)๋ฅผ ๋ง๋ค์ด ์ผ๋ จ์ ์์ ํ์น์ ์ ์ํ๊ณ ,
๊ทธ ์ค ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ถ๋ถ์ ์ถ์ ๋ฉ์๋๋ ํ (hook) ๋ฉ์๋ ํํ๋ก ๋จ๊ฒจ๋์ด ํ์ ํด๋์ค์์ ๊ตฌ์ฒด ๊ตฌํํ๋ค.
์ด ๋ฐฉ์์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ์ธ๋ถ ๋จ๊ณ ๊ตฌํ์ ๋ค์ํํ ์ ์๊ณ ,
์ฝ๋์ ์ค๋ณต์ ์ค์ด๋ฉฐ ๊ณตํต ๋ก์ง์ ์์ ํด๋์ค์์ ๊ด๋ฆฌํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํ์ผ์ ์ฝ๊ณ ํ์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์ ๋ง๋ค๊ณ ,
ํ์ผ ํฌ๋งท๋ณ๋ก ํ์ฑ ๋ฐฉ์๋ง ํ์ ํด๋์ค์์ ๊ตฌํํ๋๋ก ํ๋ฉด,
์ ์ฒด ํ๋ฆ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์๋ CSV, JSON, XML ๋ฑ ๋ค์ํ ํฌ๋งท์ ๋์ํ ์ ์๋ค.
๋ ๊ฒ์ ๊ฐ๋ฐ์์ ๊ฒ์ ๋ฃจํ์ ์ ์ฒด ํ๋ฆ(์ด๊ธฐํ -> ์ ๋ฐ์ดํธ -> ์ข ๋ฃ)์ ํ ํ๋ฆฟ ๋ฉ์๋๋ก ์ ์ํ๊ณ ,
๊ฐ ๋จ๊ณ์ ๊ตฌ์ฒด ์ฌํญ์ ์๋ธํด๋์ค์์ ๊ตฌํํ๋ ๊ฒ๋ ์ด ํจํด์ ํ์ฉ ์์ด๋ค.
11) ๋ฐฉ๋ฌธ์(Visitor) ํจํด
๋ฐฉ๋ฌธ์ ํจํด์ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ์ฌ,
๊ตฌ์กฐ๋ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก ํด์ฃผ๋ ํจํด์ด๋ค.
์ฌ๋ฌ ์ข ๋ฅ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์ ๋,
๊ฐ ๊ฐ์ฒด์ ํด๋์ค์ ๋ณ๊ฒฝ์ ๊ฐํ์ง ์๊ณ ์๋ก์ด ์ฐ์ฐ์ ์ถ๊ฐํ๋ ค๋ฉด ๋ฐฉ๋ฌธ์ ๊ฐ์ฒด๊ฐ ๊ฐ ์์๋ฅผ ๋ฐฉ๋ฌธํ๋ฉฐ ๊ธฐ๋ฅ์ ์ํํ๊ฒ ํ๋ค.
๊ตฌ์กฐ์ ์ผ๋ก ๋ฐฉ๋ฌธ์ ์ธํฐํ์ด์ค(Visitor)์ ๊ตฌ์ฒด ๋ฐฉ๋ฌธ์ ํด๋์ค๋ค,
์์์ ํด๋นํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ฐ ํด๋์ค๋ค์ด ์ฐธ์ฌํ๋ค.
๊ฐ ์์ ํด๋์ค๋ accept(Visitor) ๋ฉ์๋๋ฅผ ํตํด ๋ฐฉ๋ฌธ์๋ฅผ ๋ฐ์๋ค์ด๊ณ ,
๋ฐฉ๋ฌธ์๋ ๊ฐ ์์๋ณ๋ก ์ค๋ฒ๋ก๋๋ visit(ElementType) ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ํด๋น ์์์ ๋ํ ์ฐ์ฐ์ ์ํํ๋ค.
์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์์ ํด๋์ค์ ์์ ์์ด๋ ์๋ก์ด ์ฐ์ฐ(๋ฐฉ๋ฌธ์)์ ์ถ๊ฐํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง,
์์์ ์ข ๋ฅ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ฉด ๋ชจ๋ ๋ฐฉ๋ฌธ์ ํด๋์ค๋ฅผ ์์ ํด์ผ ํ๋ ๋จ์ ๋ ์๋ค.
๋ฐฉ๋ฌธ์ ํจํด์ ์ปดํ์ผ๋ฌ์ AST ์ฒ๋ฆฌ, ์ค๋ธ์ ํธ ๊ตฌ์กฐ๋ฅผ ์ํํ๋ฉฐ ๋ค์ํ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ ๋ก์ง ๋ฑ์ ์์ฉ๋ ์ ์๋ค.
5. ๊ฒฐ๋ก
๋์์ธ ํจํด์ ์ํํธ์จ์ด ๊ฐ๋ฐ์๋ค์๊ฒ ๊ฒ์ฆ๋ ์ค๊ณ ์ง์์ ์งํฉ์ ์ ๊ณตํ๋ค.
ํจํด์ ์ ํ์ฉํ๋ฉด ์ฝ๋์ ํ์ง๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ณ , ํ์ ๊ฐ ์ํํ ์ํต์ ๋๋ชจํ ์ ์๋ค.
๋ค๋ง ํจํด์ ๋ง๋ฅ ํด๋ฒ์ด ์๋๋ฉฐ, ์ํฉ์ ๋ง๊ฒ ์ ์ ํ ํจํด์ ์ ํํ๊ณ ์ ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ฌด์กฐ๊ฑด ๋จ์ฉํ๊ธฐ๋ณด๋ค๋ ๋ฌธ์ ์ ๋ฌธ๋งฅ์ ์ดํดํ ํ ๊ทธ์ ๋ถํฉํ๋ ํจํด์ ํ์ฉํด์ผ ํ๋ค.
์ด๋ณด ๊ฐ๋ฐ์๋ผ ํ๋๋ผ๋ ์์ฃผ ์ฐ์ด๋ ๋์์ธ ํจํด์ ๊ฐ๋ ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ดํดํด ๋๋ฉด,
๋ณด๋ค ์ฒด๊ณ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ๋ฅผ ํ๋ ๋ฐ ํฐ ๋์์ด ๋๋ค.
๋ณธ ํฌ์คํธ์์ ๋ค๋ฃฌ ์์ฑ, ๊ตฌ์กฐ, ํ์ ํจํด๋ค์ ์์๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ์ฝ๋์ ์ด๋ป๊ฒ ์ ์ฉํ ์ง ๊ณ ๋ฏผํด ๋ณด๊ณ ์ฐ์ตํด๋ณด์.
๋์์ธ ํจํด์ ์ ๊ทน์ ์ผ๋ก ์ตํ๋๋ค๋ฉด ์๋ก์ด ๊ณผ์ ๋ ๋ณต์กํ ์์คํ ์ ๋ง์ฃผํ์ ๋
๋ณด๋ค ๋น ๋ฅด๊ณ ์ฐ์ํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
'๐จ๏ธ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฐฑ์๋ ๊ฐ๋ฐ์ ๊ธฐ์ ๋ฉด์ ์๋ฒฝ ๋๋น์ (11) | 2025.07.23 |
|---|---|
| Redis๋ ๋ฌด์์ธ๊ฐ? ์ค์น๋ถํฐ ํ์ฉ ์ฌ๋ก๊น์ง ์๋ฒฝ ๊ฐ์ด๋ (4) | 2025.07.02 |