GoF์˜ ๋””์ž์ธ ํŒจํ„ด, ๋ณตํ•ฉ์ฒด ํŒจํ„ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

ํ•ด๋‹น ๊ธ€์€, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์•ฝ

  • ๋‹จ์ผ์ฒด์™€ ์ง‘ํ•ฉ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ๋™์ผํ•œ ๊ฐœ๋…์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด
  • ํด๋” ๊ตฌ์กฐ, View ๊ตฌ์กฐ ๋“ฑ์ด ์˜ˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
  • ๋ถ€๋ถ„๊ณผ ์ „์ฒด์˜ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋“ค์„ ๋ชจ์•„ ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

์˜ˆ์‹œ

  • ํด๋”๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
  • ํŒŒ์ผ ์ €์žฅ ๊ตฌ์กฐ๋Š” ํŒŒ์ผ๊ณผ ํด๋” ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‘ ํƒ€์ž…์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” unit์ด ์žˆ๊ณ , ์ด unit์—์„œ๋Š” ์ด๋ฆ„๊ณผ ํฌ๊ธฐ๋ฅผ ์ง€์ •๊ฐ€๋Šฅํ•˜๋‹ค.
  • Folder์˜ ๊ฒฝ์šฐ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ ํ˜น์€ ํด๋”๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ผ์ฒด๋Š” ํŒŒ์ผ, ์ง‘ํ•ฉ์ฒด๋Š” ํด๋”๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ, Folder๋Š” ์ž์‹ ์—๊ฒŒ ์†ํ•œ unit์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ ๋‚ด๋ถ€ ํŒŒ์ผ, ํด๋”๋ฅผ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ ์—์„œ Composite ํŒจํ„ด์€ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ํ•„์—ฐ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
  • ์ฝ”๋“œ

๋™๊ธฐ

  • ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.
  • ๊ฐ๊ฐ์˜ File๊ณผ ์ด File๋“ค์„ ๊ฐ–๋Š” Container๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๊ณ ,
  • ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‘ ํƒ€์ž…์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ๋ฌถ์–ด ํŠธ๋ฆฌ๊ตฌ์กฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜์„ ํ†ตํ•ฉํ•ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ๋Š” ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†์ด ํ•˜๋‚˜์˜ Unit ์ด๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ™œ์šฉ์„ฑ

  • ๋ถ€๋ถ„-์ „์ฒด์˜ ๊ฐ์ฒด ๊ณ„ํ†ต์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ์ฒด์˜ ํ•ฉ์„ฑ์œผ๋กœ ์ƒ๊ธด ๋ณตํ•ฉ ๊ฐ์ฒด์™€ ๊ฐœ๊ฐœ์˜ ๊ฐ์ฒด ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๊ณ ๋„ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
    • UIView๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

๊ตฌ์กฐ

์ฐธ์—ฌ์ž

  • Component(Unit)
    • ์ง‘ํ•ฉ ๊ด€๊ณ„์— ์ •์˜๋  ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
    • ์ „์ฒด ํด๋ž˜์Šค์— ์†ํ•œ ์š”์†Œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
  • Leaf(File)
    • ๊ฐ€์žฅ ๋ง๋‹จ์˜ ๊ฐ์ฒด
    • ํฌํ•จ๋˜๋Š” ๊ฒƒ์ด ์—†๋Š” ๊ฐ์ฒด
  • Composite(Folder)
    • ์ž์‹์ด ์žˆ๋Š” ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ํ–‰๋„ ์ •์˜
  • Client(main())

ํ˜‘๋ ฅ ๋ฐฉ๋ฒ•

  • ์‚ฌ์šฉ์ž๋Š” ๊ฐ์ฒด๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด Component ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Leaf ์ธ์Šคํ„ด์Šค๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•˜๋‹ค๋ฉด, ์ž์‹ ์ด ์ •์˜ํ•œ ํ–‰๋™์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • Composite ์ธ์Šคํ„ด์Šค ์˜€๋‹ค๋ฉด, ์ž์‹ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.
    • ๊ทธ ์ „์— ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ฒฐ๊ณผ

  • ๊ธฐ๋ณธ ๊ฐ์ฒด์™€ ๋ณตํ•ฉ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋œ ํ•˜๋‚˜์˜ ์ผ๊ด€๋œ ํด๋ž˜์Šค ๊ณ„ํ†ต์„ ์ •์˜ํ•œ๋‹ค.
  • ์ผ๋ฐ˜ํ™”๋œ ์ƒ์œ„ ๊ฐœ๋…์˜ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง„๋‹ค.
  • ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€๊ฐ€๋Šฅํ•˜๋‹ค.

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

  • ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋ถ€๋ชจ๊ฐ„์˜ ์—ฐ๊ฒฐ์€ ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • ์žฅ์‹์ž ํŒจํ„ด๊ณผ ๋ณตํ•ฉ์ฒด ํŒจํ„ด์€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
  • ํ”Œ๋ผ์ด๊ธ‰ ํŒจํ„ด์œผ๋กœ ๊ตฌ์„ฑ์š”์†Œ์˜ ๊ณต์œ  ๋ฐฉ๋ฒ•์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋ณต์ž ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

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

  • View ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•ด๋‹น ๊ตฌ์กฐ๋ฅผ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • UIView์˜ ๊ฒฝ์šฐ, View๊ฐ€ ์ง‘ํ•ฉ์ฒด์ด์ž ๋‹จ์ผ์ฒด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
  • View์˜ ๊ตฌ์กฐ๋ฅผ ๋ณผ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์Œ์„ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ hitTest์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ์งœ์—ฌ์žˆ๋‹ค.

Reference