ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[Cocoa Design Pattern] 21. Prototype

created:2011-07-12
updated:2015-07-03
edit
![](http://ash84.net/wp-content/uploads/1/cfile21.uf.197E8A4E4E1BAD76357DCD.jpg)
**ํ”„๋กœํ†  ํƒ€์ž…์ด๋ž€?** โ€“ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด โ€“ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€, ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๋‹ค. โ€“ ๊ฐ์ฒด๊ฐ„์˜ ๊ฐ•ํ•œ ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ํ”ผํ•˜๋„๋ก ํ•ด์ค€๋‹ค. โ€˜**ํŒจํ„ด์ด ๋งŒ๋“ค์–ด์ง„ ๋™๊ธฐย ** โ€“ ์ƒˆ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด์™€ ํ•ด๋‹น ๊ฐ์ฒด์˜ ํƒ€์ž…๊ฐ„์˜ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ย  โ€“ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ปดํŒŒ์ผ์‹œ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ๋Ÿฐํƒ€์ž„์‹œ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.ย  **ํŒจํ„ด์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ** โ€“ ํ•ต์‹ฌ๊ธฐ๋Šฅ : ๋ณต์‚ฌ ๋ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒย  โ€“ NSCopying, NSCoding ํ”„๋กœํ† ์ฝœ ์ œ๊ณต *** NSCopying protocol ย โ€“ copyWithZone ย ๋ฉ”์†Œ๋“œ** โ€“ ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ์ฒด์™€ ๋™์ผํ•œ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.ย 
1. Shallow Copy โ€“ ๋ณต์‚ฌ๋˜๋Š” ๊ฐ์ฒด์™€ ๋™์ผํ•œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.ย  โ€“ ์›๋ณธ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋˜ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ, ํฌ์ธํ„ฐ ๋ณต์‚ฌย 2. Deep Copy โ€“ ์›๋ณธ ๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์˜ ์‹ค์ œ ๋ณต์‚ฌ๋ณธ์„ ์ €์žฅ
* ํ”„๋กœํ†  ํƒ€์ž… ํŒจํ„ด์€ ๋”ฅ ์นดํ”ผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด์™€ ๊ฐ€์žฅ ์ž˜ ๋™์ž‘, ย  ์™„๋ฒฝํžˆ ๋…๋ฆฝ์ ์ธ ์‚ฌ๋ณธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž„.ย  ex) IB Library์˜ ๊ฒฝ์šฐ, ๋ณต์‚ฌ๋œ ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ๋™์ž‘ํ•ด์•ผํ•จ.ย ๊ทธ๋Ÿฌ๋‚˜, ๋Œ€๋ถ€๋ถ€์˜ ์ฝ”์ฝ”์•„ํด๋ž˜์Šค๋Š” NSCopying ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•ด์„œ Shallow copy๋ฅผ ๋ฐ˜ํ™˜ํ•จ.ย  *** Deep Copy๊ฐ€ ์‰ฝ์ง€ ์•Š์€ ์ด์œ ** ย  : ์ฐธ์กฐํ•˜๊ณ ์žˆ๋Š” ๊ฐ์ฒด์ค‘ Shallow copy๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค๋ฉด, ์„ž์ด๊ฒŒ ๋œ๋‹ค.ย  *** NSArchiver, NSUnarchiver class ๋Š” ์‰ฌ์šด Deep Copy ๋ฐฉ์‹์„ ์ œ๊ณตย ** โ€“ ๋ณต์‚ฌ๋˜๋Š” ๊ฐ์ฒด์™€ ๊ทธ ๊ฐ์ฒด ๋‚ด์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์ด NSCoding Protocol์„ ๋”ฐ๋ฅธ๋‹ค๋ฉด, Deep Copy ๋ฐ˜ํ™˜ โ€“ 347p ์˜ˆ์ œ : ์•„์นด์ด๋น™ ํ•œ ํ›„, ์–ธ์•„์นด์ด๋น™ํ•˜๋Š” ๊ฒƒ์€ ๋”ฅ ์นดํ”ผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์–ต์ง€ ๊ธฐ๋ฒ• โ€“ ย IB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹.ย  โ€“ โ€ ์ž‘์—…์ค‘์ธ .NIB ํŒŒ์ผ์— ๊ฐ์ฒด๋ฅผ ๋“œ๋ž˜๊ทธ ํ•ด์„œ ์˜ฎ๊ธฐ๋ฉด, ๊ฐ์ฒด๋Š” ๊ธฐ์กด์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธ์Šคํ„ด์Šค๋ฅด์—์„œ ๋จผ์ € ์•„์นด์ด๋ธŒ ๋˜๊ณ ๋‚˜์„œ ์–ธ ์•„์นด์ด๋ธŒํ•˜์—ฌ ์ถ”๊ฐ€ ํŽธ์ง‘ํ•  ์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  .NIB ํŒŒ์ผ์ด ์ €์žฅ๋  ๋•Œ, ๊ฐ์ฒด๋“ค์€ ๋‹ค์‹œ ์•„์นด์ด๋ธŒ๋œ๋‹ค. .NIBํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋ฉด ํŒŒ์ผ์—์„œ ๊ฐ์ฒด๊ฐ€ ์–ธ์•„์นด์ด๋ธŒ ๋˜์–ด์„œ IB์— ๋ณต์›๋œ๋‹ค.โ€ *** NSCell โ€“ NSCopyingํ”„๋กœํ† ์ฝœ์˜ ๋‹ค๋ฅธ ๊ธฐ๋ฒ•์ธ NSCopyObject() ํ•จ์ˆ˜ ์‚ฌ์šฉํ•จ.ย  ** NSCopyObject : ์›๋ณธ์ด ์ฐจ์ง€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ Shallow Copy ์ƒ์„ฑํ•จ.ย  ์ดํ›„, NSCell์˜ -copyWithZone์ด ์›๋ณธ์— ์ €์žฅ๋œ ์†์„ฑ์ด ์ฐธ์กฐํ•œ๋Š ๊ฐ์ฒด์— copy ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ๋ณต์‚ฌํ•จ.ย  NSCell์€ Shallow copy ์™€ ย Deep Copy๋ฅผ ์„ž์–ด ์”€.ย  ** ์ฝ”์ฝ”์•„ ์‚ฌ์šฉ ์˜ˆ์ œย ** โ€“ IB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด๋Š” ๋ชจ๋‘ ํ”„๋กœํ† ํƒ€์ž… : ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•จ์œผ๋กœ์จ IB๋ฅผ ์žฌ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์•„๋„ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•จ.ย  โ€“ NSMatrix ํด๋ž˜์Šค์—์„œ๋Š” ํ”„๋กœํ† ํƒ€์ž… NSCell ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•จ. โ€“ ๋งคํŠธ๋ฆญ์Šค์—์„œ ํ–‰, ์—ด ์ถ”๊ฐ€๊ฐ€ ์žˆ์„์‹œ์—๋Š” ํ•„์š”ํ•œ ๋งŒํผ ํ”„๋กœํ† ํƒ€์ž… ์…€์„ ๋ณต์‚ฌํ•œ๋‹ค.ย  โ€“ NSMatrix ํด๋ž˜์Šค๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ์…€์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.ย 
**349p** NSCell์˜ ์„œ๋ธŒ ํด๋ž˜์Šคย MYLabeledBarCell์—์„œ ์ •์˜ํ•œ barValue ์—ญ์‹œ NSCopyObject()์— ์˜ํ•ด์„œ ์ƒ์†๋œ ๋ณ€์ˆ˜๋“ค๊ณผ ํ•จ๊ป˜ ์ž๋™์œผ๋กœ ๋ณต์‚ฌ๋œ๋‹ค. ย 
ย  * NSCopyObject() ํ•จ์ˆ˜๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.ย  * NSCell์˜ NSCopyObejct() ์‚ฌ์šฉ์€ NSCell์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์„œ๋ธŒํด๋ž˜์Šค ์ƒ์„ฑํ•˜๊ธฐ๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.ย  **ํŒจํ„ด ์‚ฌ์šฉ ๊ฒฐ๊ณผ**
โ€“ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋งŒํผ ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์†Œ์š”(์ ˆ์•ฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹˜)
โ€“ NSMatrix ์˜ ๊ฒฝ์šฐ, ํ•„์š”ํ•œ ์…€์˜ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๋”๋ผ๋„ ํ”„๋กœํ† ํƒ€์ž…์˜ ์…€ ์‚ฌ๋ณธ์„ ๊ฑฐ์˜ ๋ฆด๋ฆฌ์ฆˆ ํ•˜์ง€ ์•Š๋Š”๋ฐ, ๋‹ค์‹œ ํ•„์š”ํ•  ๊ฒฝ์šฐ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋ณธ์„ ์ €์žฅํ•˜๋Š”๋ฐ ์†Œ๋น„๋œ๋‹ค๋Š” ์ธก๋ฉฐ์—์„œ ๋ณด๋ฉด ๋‹จ์ ์ด๋‹ค. ย โ€“ ํ”„๋กœํ† ํƒ€์ž… ํŒจํ„ด ์ฃผ์˜์‚ฌํ•ญ : ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ง€์›ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ–‰๋™์„ ๋ฌธ์„œํ™” ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•จ.ย 

#dev  #IOS  #prototype pattern  #๋””์ž์ธํŒจํ„ด  #ํ”„๋กœํ† ํƒ€์ž