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() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๊ฒฐ๊ณผ

์žฅ์ 

  1. ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด product๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. == ์œ ์—ฐํ•˜๋‹ค.
    • ๋Ÿฐํƒ€์ž„์— clone() ํ˜ธ์ถœํ•˜์—ฌ ์žฅ๋‚œ์น˜๊ธฐ
  2. ๊ฐ’๋“ค์„ ๋‹ค์–‘ํ™”ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. == ๋™์  ์„ฑ๊ฒฉ์„ ๋ˆ๋‹ค.
    • Point cloneํ›„ ๊ฐ’ ๋ณ€๊ฒฝ
  3. ๊ตฌ์กฐ๋ฅผ ๋‹ค์–‘ํ™”ํ•จ์œผ๋กœ์จ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    • line์„ Group์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋‹ค๊ฐํ˜• ์ƒ์„ฑ ๊ฐ€๋Šฅ
  4. ์„œ๋ธŒ ํด๋ž˜์Šค์˜ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.
    • ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ƒ์„ฑํ•  ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋‹ค๊ฐํ˜•์— ๋Œ€ํ•ด ํƒ€์ž… ๋ช…์‹œํ•ด์•ผํ•จ

๋‹จ์ 

  1. clone() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ด๋ฏธ ์ž˜ ๋งŒ๋“ค์–ด์ ธ์žˆ๋Š” ํด๋ž˜์Šค์— ์ด๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
    • ์ฃ„๋‹ค ๋ณต์‚ฌํ•ด์„œ ๋ฆฌํ„ดํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ด€๋ จ ํŒจํ„ด๊ณผ ์ฐจ์ด์ 

  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฒฝ์Ÿ์ ์ธ ๊ด€๊ณ„์— ๋†“์—ฌ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์—์„œ ์›ํ˜• ์ง‘ํ•ฉ์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ๋ณต์ œํ•˜์—ฌ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ณตํ•ฉ์ฒด ํŒจํ„ด, ์žฅ์‹์ž ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์„ค๊ผ์—์„œ ์›ํ˜• ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ๊ฐํ•ด ๋ณผ ์ 

  • ์‚ฌ์‹ค ์ด Prototype ํŒจํ„ด์€, ์‹ค์งˆ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ผ์ด ์ ๋‹ค.
  • ๊ทธ ์ด์œ ๋Š”, ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•ด๋†“์€ ๊ฒƒ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ

NSCopying

  • Swift์—์„œ๋Š” ์œ„์˜ Prototype ํŒจํ„ด์ด ์–ด๋””์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์„๊นŒ?
  • NSCopying์ด๋‹ค.
  • ์ฝ”๋“œ์—์„œ Class > NSCopying ๋‚ด๋ถ€์— ๊ตฌํ˜„ํ•ด๋‘์—ˆ๋‹ค.
  • ์‚ดํŽด๋ณด๋ฉด, ์ฝ”๋“œ๋Š” ๋ฐ”๊พผ๊ฒŒ ๊ฑฐ์˜ ์—†๋‹ค.
  • ์ฆ‰, ์ด๋ฏธ Prototype ํŒจํ„ด์ด ์ ์šฉ๋œ ๊ฒƒ
  • ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์—์„œ๋Š” NSObject๋ฅผ ์ƒ์†๋ฐ›์€ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ,
  • ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์ด๋ฏธ NSCopying์„ ์ฑ„ํƒํ•œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค ๋งจ์ฒ˜์Œ ๊ตฌํ˜„์€ ์ค‘๋ณต ๊ตฌํ˜„์ด๋‹ค.

Struct

  • ์ด๋ณด๋‹ค ์ข‹์€ ๋ฐฉ์‹์€ struct๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์‚ฌ์‹ค ์œ„์™€ ๊ฐ™์ด Prototype ํŒจํ„ด์ด ์‚ฌ์šฉ๋œ ์ด์œ ๋Š”, Class๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.
  • struct์˜ ๊ฒฝ์šฐ copy ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋„ ์—†์ด ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด๋‹ค.
    • ํ• ๋‹น
    • ๋ฐ˜ํ™˜
    • ์ธ์ž
  • ๋‹ค๋งŒ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ํ•ญ์ƒ ๋ณต์‚ฌ๋œ๋‹ค๋ฉด ์ด๋Š” ๋ถ„๋ช…ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜จ ๊ฐœ๋…์ด copyOnWrite.
  • ์‹ค์ œ๋กœ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ์— ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•จ์œผ๋กœ์จ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ์•„๋‚€๋‹ค.

Reference