GoF์ ๋์์ธ ํจํด, ์ํ ํจํด์ ๋ํด ์์๋ณธ๋ค.
ํด๋น ๊ธ์, ๋ค์์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ดํดํ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค.
ํต์ฌ ์์ฝ
- ์ํ์ด ๋๋(prototypical) ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ๊ฐ์ฒด์ ์ข
๋ฅ๋ฅผ ๋ช
์ํ๊ณ , ์ด๋ฅผ ๋ณต์ฌํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด
- ์ฆ, ์คํ์ค์ ์์ฑ๋ ๊ฐ์ฒด๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด
- ์์ฑ๋ ๊ฐ์ฒด ๋ด๋ถ์
copy()
๋ฉ์๋๋ฅผ ํตํด ์์ฑ
- Prototype์ผ๋ก ๋ง๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํด๋ ์๋ณธ ๊ฐ์ฒด์ ์ํ๋ ๋ณ๊ฒฝ๋์ง ์์
- Deep copy
- ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋ ์๋ก์ด ํน์ง์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ฒฝ์ฐ ์ฉ์ดํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ
- Rectangle == Group(line * 4, point * 4)
- Triangle == Group(line * 3, point * 3)
- ์ด๋ฏธ ๋ง๋ค์ด์ง line, point ๊ฐ์ฒด๋ฅผ copyํ์ฌ group์ ๋ฃ์ด ํํ ๊ฐ๋ฅ
- ๋ง์ฝ ํฉํ ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ ์ ์ํด๋๊ณ ๋ง๋ค์ด์ผ ํจ, ์ฆ, ์๋ธํด๋์ค ๊ฐ์๊ฐ ๋ง์์ง
- ์ฆ, ์ ์ฐ์ฑ์ ๋ณด์ฅํ๋ ํจํด์ค ํ๋์
- Composite, Decorator ํจํด์ ๋งค์ฐ ๋ง์ด ์ฌ์ฉํ ๋ฌด๊ฑฐ์ด ์ค๊ณ์ธ ๊ฒฝ์ฐ Prototype์ ์ ์ฉํ์ฌ ๋ ์ข๊ฒ ๋ง๋ค ์ ์๋ค.
- ๊ฐ์ฒด ์ด๊ธฐํ ๋น์ฉ์ด ์์ฃผ ๋น์ ๊ฒฝ์ฐ overhead๋ฅผ ์ค์ฌ์ค๋ค.
- DB์์ ๊ฐ์ ์ฝ์ด์์ ์ด๊ธฐํํด์ผ ํ๋๋ฐ ํญ์ ๊ฐ์ ๊ฐ์ด ๋ณด์ฅ๋๋ ๊ฒฝ์ฐ ์ธ์คํด์ค๋ฅผ ์ฆ์ ๋ณต์ฌํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋
- ๊ฐ์ ํ์
์ ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ๊ฑฐ์ ์ ์ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ์ฉ ๊ฒฝ์ฐ๋ฅผ ์ต์ ํ
- ์ฝ๋์์ด ์ค์ด๋ค ๊ฒ์
์์
- Prototype: ๊ฐ์ฒด๋ก๋ถํฐ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ํ๊ธฐ ์ํ interface
- Shape: Point, Line, Group์ ์์ interface
- Group: Shape์ ์ฌ๋ฌ๊ฐ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ์์ ๋ง๋ฆ
- *: 0~๊ฐ์ ๊ฐ์ ๊ฐ์ง ์ ์์์ ์๋ฏธ
- ์ฌ๊ฐํ ๋ํ์ Group์ ํตํด ๋ง๋๋ ๊ฒ์ ๋ณด์ฌ์ค ์์
- ๊ตฌ์ฒด์ ์ธ ์ฌ๊ฐํ ํด๋์ค๊ฐ ์์์๋ ๊ธฐ์กด์ point, line ๊ฐ์ฒด๋ฅผ ์กฐํฉํด์ ์์ฑํ ๊ฒ
- ์ฝ๋
- Class > Pattern ํด๋ ์์ ์๋ ๋ด์ฉ์ ์์ ๊ฐ์ด ๊ตฌํํจ
ํ์ฉ์ฑ
- ์ ํ์ ์์ฑ, ๋ณตํฉ, ํํ ๋ฐฉ๋ฒ์ ๋ ๋ฆฝ์ ์ธ ์ ํ์ ๋ง๋ค๊ณ ์ ํ ๋ ์ฌ์ฉ
- ์ธ์คํด์คํํ ํด๋์ค๋ฅผ ๋ฐํ์์ ์ง์ ํ ๋
- ์ ํ ํด๋์ค ๊ณํต๊ณผ ๋ณ๋ ฌ์ ์ผ๋ก ๋ง๋๋ ํฉํ ๋ฆฌ ํด๋์ค๋ฅผ ํผํ๊ณ ์ถ์ ๋
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ฌ์ฉํด์ ์ฒ๋ฆฌํ๊ณ ์ถ์ง ์์ ๋
- ๋ณ๋ ฌ์ ๊ตฌ์ฑ์ผ๋ก ํ๋ฉด ํด๋์ค๊ฐ ๋๋ฌด ๋ง์ด ์๊น
- ํด๋์ค์ ์ธ์คํด์ค ๋ค์ด ์๋ก ๋ค๋ฅธ ์ํ ์กฐํฉ์ค์ ์ด๋ ํ๋์ผ ๋
- ์์ ์์์์ Rect์ line 4๊ฐ์ Group์ผ๋ก ์นํํ ์ ์์
์ฐธ์ฌ์
- Prototype(
Prototype
) - ConcretePrototype(
Point
,Line
,Group
) - Client(
main
ํจ์)
ํ๋ ฅ ๋ฐฉ๋ฒ
- client๋ prototype์
clone()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
๊ฒฐ๊ณผ
์ฅ์
- ๋ฐํ์์ ์๋ก์ด product๋ฅผ ์ถ๊ฐํ๊ณ ์ญ์ ํ ์ ์๋ค. == ์ ์ฐํ๋ค.
- ๋ฐํ์์
clone()
ํธ์ถํ์ฌ ์ฅ๋์น๊ธฐ
- ๋ฐํ์์
- ๊ฐ๋ค์ ๋ค์ํํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. == ๋์ ์ฑ๊ฒฉ์ ๋๋ค.
- Point cloneํ ๊ฐ ๋ณ๊ฒฝ
- ๊ตฌ์กฐ๋ฅผ ๋ค์ํํจ์ผ๋ก์จ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
- line์ Group์ ์ถ๊ฐํ์ฌ ๋ชจ๋ ์ข ๋ฅ์ ๋ค๊ฐํ ์์ฑ ๊ฐ๋ฅ
- ์๋ธ ํด๋์ค์ ์๋ฅผ ์ค์ธ๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ฌ์ฉํ๋ค๋ฉด ์์ฑํ ๋ชจ๋ ์ข ๋ฅ์ ๋ค๊ฐํ์ ๋ํด ํ์ ๋ช ์ํด์ผํจ
๋จ์
clone()
๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.- ์ด๋ฏธ ์ ๋ง๋ค์ด์ ธ์๋ ํด๋์ค์ ์ด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
- ์ฃ๋ค ๋ณต์ฌํด์ ๋ฆฌํดํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ด๋ จ ํจํด๊ณผ ์ฐจ์ด์
- ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๊ฒฝ์์ ์ธ ๊ด๊ณ์ ๋์ฌ์๋ค.
- ํ์ง๋ง ํจ๊ป ์ฌ์ฉ๋ ์๋ ์๋ค.
- ์ถ์ ํฉํ ๋ฆฌ ํจํด์์ ์ํ ์งํฉ์ ์ ์ฅํ๊ณ ์๋ค๊ฐ ํ์ํ ์์ ์ ๋ณต์ ํ์ฌ ์ํ๋ ์ ํ์ ๋ง๋ค์ด์ ๋ฐํํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ณตํฉ์ฒด ํจํด, ์ฅ์์ ํจํด์ ๋ง์ด ์ฌ์ฉํด์ผ ํ๋ ์ค๊ผ์์ ์ํ ํจํด์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ ์ ์๋ค.
์๊ฐํด ๋ณผ ์
- ์ฌ์ค ์ด Prototype ํจํด์, ์ค์ง์ ์ผ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ ์ผ์ด ์ ๋ค.
- ๊ทธ ์ด์ ๋, ์ด๋ฏธ ๋๋ถ๋ถ์ ์ธ์ด์์ ์ด์ ๊ฐ์ ๋ฐฉ์์ ์ฑํํด๋์ ๊ฒ์ด ๋ง๊ธฐ ๋๋ฌธ
NSCopying
- Swift์์๋ ์์ Prototype ํจํด์ด ์ด๋์์ ์ฌ์ฉ๋์์๊น?
NSCopying
์ด๋ค.- ์ฝ๋์์ Class > NSCopying ๋ด๋ถ์ ๊ตฌํํด๋์๋ค.
- ์ดํด๋ณด๋ฉด, ์ฝ๋๋ ๋ฐ๊พผ๊ฒ ๊ฑฐ์ ์๋ค.
- ์ฆ, ์ด๋ฏธ Prototype ํจํด์ด ์ ์ฉ๋ ๊ฒ
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ฒ์์ผ๋ก ๊ตฌํํ ๊ฒ์์๋ NSObject๋ฅผ ์์๋ฐ์ ์ํ์์ ์์ํ๋๋ฐ,
- ๊ทธ๋ ๊ฒ๋๋ฉด ์ด๋ฏธ NSCopying์ ์ฑํํ ์ํ์์ ์์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ค ๋งจ์ฒ์ ๊ตฌํ์ ์ค๋ณต ๊ตฌํ์ด๋ค.
Struct
- ์ด๋ณด๋ค ์ข์ ๋ฐฉ์์ struct๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- ์ฌ์ค ์์ ๊ฐ์ด Prototype ํจํด์ด ์ฌ์ฉ๋ ์ด์ ๋, Class๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ผ ์๊ฐํ๋ค.
- struct์ ๊ฒฝ์ฐ
copy
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ด ๋ณต์ฌ๋๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด๋ค.- ํ ๋น
- ๋ฐํ
- ์ธ์
- ๋ค๋ง ๋ฌด๋ถ๋ณํ๊ฒ ํญ์ ๋ณต์ฌ๋๋ค๋ฉด ์ด๋ ๋ถ๋ช ํ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋์จ ๊ฐ๋ ์ด copyOnWrite.
- ์ค์ ๋ก ๋ณํ๊ฐ ๋ฐ์ํ ์์ ์ ๋ณต์ฌ๋ฅผ ์ํํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต๋ํ ์๋๋ค.