ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“‚ ํ”„๋กœํ† ์ฝœ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Protocol-Oriented-Programming in 408 Session WWDC 15)

 

๐ŸŽฏ ํ”„๋กœํ† ์ฝœ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ดํ•˜ POP) {1ํŽธ - ์™œ OOP(Object Oriented Programming)์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ๊ฐ€?}

 

  • 2015๋…„ WWDC์˜ POP ์„ค๋ช… ์˜์ƒ์„ ํ†ตํ•ด POP๋ฅผ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์€ ๊ด€๊ณ„๋กœ ์—ฌ๋Ÿฌ ํŽธ์— ๋‚˜๋ˆ„์–ด ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • WWDC์—์„œ๋Š” Crusty(์‹ฌ์Šจ?)๋ผ๋Š” ์•„์ €์”จ๋ฅผ ๋“ฑ์žฅ์‹œ์ผœ ์žฅ๋‹จ์ ์„ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ˜•์‹์˜ ๋ฐœํ‘œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค!

 

๐Ÿ“‚ Classes are Awesome!

 

  • POP๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ OOP์˜ ๊ฐœ๋…์— ํ™œ์šฉ๋˜์—ˆ๋˜ Class์˜ ์žฅ์ ์„ ๋จผ์ € ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    1. Encapsulation(์บก์Šํ™”): ๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ๋™์ž‘๋“ค์„ ๋ชจ์•„๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. Access Control(์ ‘๊ทผ์ œ์–ด): ์ฝ”๋“œ ์™ธ๋ถ€์™€ ๋‚ด๋ถ€๋ฅผ ๊ตฌ๋ถ„์ง“๋Š” ๋ฒฝ์„ ์„ธ์›Œ ์™ธ๋ถ€์—์„œ์˜ ์ ‘๊ทผ์— ์ œํ•œ์„ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ •๋ณด์— ๋Œ€ํ•œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    3. Abstraction(์ถ”์ƒํ™”): ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๊ด€๋ จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”(relatable) ์ •๋ณด๋“ค์„ ๋Œ€ํ‘œํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ๊ตฌ์ฒดํ™” ๋˜์–ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ถ”์ƒํ™”ํ•จ์œผ๋กœ์จ ์„œ๋กœ ๋‹ค๋ฅธ ์ •๋ณด๋“ค๊ฐ„์˜ ๊ณตํ†ต์ ์„ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    4. NameSpace: ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ปค์ง€๋ฉด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋Œ์„ ๋Œ€๋น„ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„(Name Space)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    5. Name Space: ๋‚ด๋ถ€ ์‹๋ณ„์ž์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์œ ํšจ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„ ์–ธ์  ์˜์—ญ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    6. ์ถœ์ฒ˜: TCPSchool
    7. Expressive Syntax: Expressive๋ž€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํ”„๋กœํผํ‹ฐ, ๋ฉ”์†Œ๋“œ ๋“ฑ์˜ ํ๋ฆ„์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    8. Extensibility(ํ™•์žฅ์„ฑ): ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ž‘์„ฑํ•ด๋†“์€ ์ฝ”๋“œ์— ์–ธ์ œ๋“ ์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ Crusty๋Š” ์œ„์˜ ๋ชจ๋“  ๊ฒƒ์„ struct์™€ enum์„ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.. ์ด ๋ง ๋•Œ๋ฌธ์— ๋ฐœํ‘œ์ž(์ดํ•˜ Dave)๋Š”์ด๋ผ๋Š” ์žฌ๋ฏธ์žˆ๋Š” ํ‘œํ˜„์„ ์ผ๋„ค์š” ใ…Žใ…Ž์—ฌ๊ธฐ์— Dave๋Š” ๋ฐ˜๊ฒฉ์„ ์œ„ํ•ด์„œ OOP๋กœ ์ด๋ฃฌ ์ˆ˜๋งŽ์€ ์—…์  ์ค‘์— ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํ•œ๋ฐฉ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋กœ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์† ๊ฐ™์€ ๊ฒƒ ๋ง์ด์ฃ .๊ฑฐ๊ธฐ์— ๋”ํ•ด ์ง„์งœ ์žฅ์ ์€ ์•„๋ž˜์˜ ๋ฌธ์žฅ์—์„œ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.ํ•ด์„ํ•ด๋ณด๋ฉด OOP์˜ ์ง„์งœ ๊ฐ•์ ์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์€ ์Šˆํผ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์–ด๋–ค ์ž‘์—…์˜ ์ž‘์€ ๋ถ€๋ถ„์„ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์žฌ์ •์˜(Override)ํ•  ์ˆ˜ ์žˆ๋Š” Customization point(์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํฌ์ธํŠธ)๋กœ ๋‚˜๋ˆ„๊ณ , ์ด ๋ถ€๋ถ„์ด ์„œ๋ธŒํด๋ž˜์Šค์˜ ๊ตฌํ˜„์—์„œ ์ค‘์ฒฉ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋ ค์šด ๋กœ์ง๋„ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ง€๊ณ  ์œ ์—ฐ์„ฑ๊ณผ ๋‹ค์–‘์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Dave๊ฐ€ 1์ธ 2์—ญ์„ ์ƒ๋‹นํžˆ ์ž˜ํ•˜์‹œ๋„ค์š”.. :)
    ๋„ˆ๊ฐ€ ๋งํ•˜๋Š” customization์„ ๋‚˜๋Š” ํ•ญ์ƒ struct๋กœ ํ•˜๊ณ ์žˆ์–ด, ๊ทธ๋ฆฌ๊ณ  class๊ฐ€ ์ข‹์€๊ฑด ์ธ์ •ํ•˜๋Š”๋ฐ ๊ทธ๋Ÿผ ๊ฑฐ๊ธฐ์— ๋”ฐ๋ฅธ ๋น„์šฉ์„ ์–˜๊ธฐํ•ด๋ณผ๊นŒ?
    ๋ผ๊ณ  ํ•˜๋ฉด์„œ Class์— ๋Œ€ํ•œ ๋ถˆ๋งŒ 3๊ฐ€์ง€๋ฅผ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ˜ก ํด๋ž˜์Šค๋Š” ์ž๋™ํ™”๋œ ๊ณต์œ ๋ฅผ ํ•œ๋‹ค:์–ด๋–ค A๊ฐ€ B์—๊ฒŒ ๊ดœ์ฐฎ์•„๋ณด์ด๋Š” ์ •๋ณด๋ฅผ ์ค„ ๋•Œ B๋Š” ๊ทธ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ , '๋Œ€ํ™”๊ฐ€ ๋๋‚ฌ๊ตฐ'์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์ด์ƒ ๋Œ€ํ™”ํ•  ์ด์œ ๊ฐ€ ์—†๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ์ด์ƒํ•œ(?) A๊ฐ€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ์ง€์ณ์„œ ๋ฐ์ดํ„ฐ๋ฅผ Pony ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. Pony๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ฐ€ Pony ๋ฐ์ดํ„ฐ๋ฅผ ์‹ซ์–ดํ•˜๊ฒ ์–ด? ํ•˜๊ณ  ๋ง์ด์ฃ . ์ด ์ˆœ๊ฐ„์—๋Š” ์‚ฌ์‹ค ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” B๊ฐ€ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ณด๋ ค๊ณ  ๋ดค๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ Pony๊ฐ€ ๋“ค์–ด์žˆ์œผ๋‹ˆ๊นŒ ๋ง์ด์ฃ !์—ฌ๊ธฐ์— Crusty๊ฐ€ ์ถ”๊ฐ€๋กœ ๋ถˆ๋งŒ์„ ํ† ๋กœํ•ฉ๋‹ˆ๋‹ค.
    '๋„ˆ๋Š” ์ฝ”๋“œ์— ์žˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ๋งˆ๊ตฌ์žก์ด๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๋ณต์‚ฌํ•˜๊ธฐ ์‹œ์ž‘ํ• ๊ฑฐ์•ผ. ๊ทผ๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด์„œ ์ด๊ฑด ์ฝ”๋“œ๊ฐ€ ๋Š๋ ค์ง€๊ฒŒ ๋งŒ๋“ค๊ฑฐ์•ผ. ๊ทธ๋ฆฌ๊ณ  ์–ด๋Š๋‚  ๋„ˆ๊ฐ€ dispatch queue๋กœ ์–ด๋–ค ์ž‘์—…์„ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์“ฐ๋ ˆ๋“œ๊ฐ€ mutable state๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— race condition์— ๋น ์งˆ ์ˆ˜ ์žˆ์–ด. ๊ทธ๋Ÿผ ๋ถˆ๋ณ€์„ฑ์„ ๋ณดํ˜ธํ•˜๊ธฐ์œ„ํ•ด lock์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ• ๊ฑฐ์•ผ. ๊ทธ๋Ÿฐ๋ฐ ์ด lock๋“ค์ด ์ฝ”๋“œ๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฐ๋“œ๋ฝ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ์ง€. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ณต์žกํ•œ ์ƒํ™ฉ์€ ํ•œ๋งˆ๋”” "๋ฒ„๊ทธ"๋ผ๊ณ  ์ •์˜๋ ๊ฑฐ์•ผ.'
    ์—ฌ๊ธฐ์„œ ๋‚˜์˜ค๋Š” ์šฉ์–ด๋“ค์€ CS ๊ด€๋ จ๋œ ๊ฒƒ์ด ๋งŽ์•„ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” ์ถ”๊ฐ€๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค! ํ˜น์‹œ ๋ชจ๋ฅด๋Š” ์šฉ์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฐพ์•„๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ๊ฐ€์ง€๋งŒ ์„ค๋ช…ํ•˜์ž๋ฉด mutable state๋ž€ ์ƒ์„ฑ ํ›„ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋Š” ๋ถˆ๋ณ€ ์ƒํƒœ๊ฐ€ ๋˜๊ฒ ์ฃ ? ์ƒ์ˆ˜์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ์ƒ์„ฑํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.์ •๋ฆฌํ•˜๋ฉด ๊ฒฐ๊ตญ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งŽ์ด ๊ณต์œ ํ•  ์ˆ˜๋ก ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ๐Ÿ˜ก ํด๋ž˜์Šค ์ƒ์†์€ ๋„ˆ๋ฌด ์ฐธ๊ฒฌํ•œ๋‹ค(class inheritance is too intrusive):
    Swift์—์„œ ์ƒ์†์€ ๋‹จ์ผ ์ƒ์†์œผ๋กœ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ˆ˜ํผํด๋ž˜์Šค๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ธŒํด๋ž˜์Šค๋„ ํ•˜๋‚˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒ ์ฃ .๋˜ ์ˆ˜ํผํด๋ž˜์Šค์— ์ €์žฅ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ๋˜๋ฉด ์„œ๋ธŒํด๋ž˜์Šค์—๋Š” ๋‹ค์Œ์˜ ์ œ์•ฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ, ์–ธ์ œ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
    ๐Ÿ˜ก ํƒ€์ž… ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์ค‘์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•œ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค:
    ์ด์ง„ํƒ์ƒ‰์ฒ˜๋Ÿผ ๋‘ ์š”์†Œ๋ฅผ ๋น„๊ต์—ํ•ด์•ผํ•˜๋Š” ๋“ฑ์˜ ๋Œ€์นญ ์—ฐ์‚ฐ์—์„œ ์ด ์˜๋ฏธ๋ฅผ ์กฐ๊ธˆ๋” ๋ช…ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด ์ƒํ™ฉ์—์„œ ๋นˆ์นธ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

    ์ด๋Ÿฐ ์—๋Ÿฌ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. Ordered ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ์กฐ๊ธˆ ๋” ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    Numberํด๋ž˜์Šค๋Š” Ordered๋ฅผ ์ƒ์† ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ ๋น„๊ต๋ฅผ ์œ„ํ•œ precedes๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? ๋‹น์—ฐํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. precedes์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ other๋Š” ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ž„์˜์˜ ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋œ Ordered์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ other์ด ๊ฐ’ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Label์ด๋ผ๋Š” ํ…์ŠคํŠธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    class Label : Ordered { var text: String = "" ... }

    ๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Number๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ๋‹ค์šด์บ์ŠคํŠธ ํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    class Number : Ordered {
      var value: Double = 0
      override func precedes(other: Ordered) -> Bool {
        return value < (other as! Number).value // ๋‹ค์šด์บ์ŠคํŠธ
      }
    }

    ์œ„์™€ ๊ฐ™์€ ๋‹ค์šด ์บ์ŠคํŠธ ๊ตฌ์กฐ(as! ASubclass)๋Š” ์‚ฌ์‹ค ํƒ€์ž…๋“ค๊ฐ„ ๊ด€๊ณ„์—์„œ ์œ ์‹ค์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ๋Š” ๊ทธ ์ž์‹ ์˜ ํƒ€์ž…๊ณผ ๋‹ค๋ฅธ ํƒ€์ž…๊ฐ„์˜ ์ค‘์š”ํ•œ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋ณดํ†ต ํด๋ž˜์Šค๋“ค๋กœ ์ถ”์ƒํ™”๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿผ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒํ™” ๊ตฌ์กฐ๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์„ ํ•„์š”๋กœ ํ• ๊นŒ์š”?

    ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ํด๋ž˜์Šค ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ๊ฐ’ ํƒ€์ž…๋„ ์ง€์›ํ•˜๊ณ , ์ •์  ํƒ€์ž… ๊ด€๊ณ„๋“ค์„ ์ง€์›ํ•˜๋ฉฐ Monolithicํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Monolithic์ด๋ผ๋Š” ๋ง์€ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ๋˜๋Š” ์•ฑ์ด ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์งˆ ๋•Œ Monolithicํ•˜๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ €๋Š” ์ด๊ฒƒ์˜ ์ดํ•ด๋ฅผ ์œ„์—์„œ ํด๋ž˜์Šค ๋‹จ์ผ ์ƒ์† ์ด์•ผ๊ธฐ ๋•Œ ๋‚˜์˜จ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์ƒ์†์˜ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ์ƒ์†์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— massive ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐœ๋…์ธ๋ฐ, ๋” ๋‚˜์€ ์ถ”์ƒํ™”์—์„œ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์•ผํ•œ๋‹ค๊ณ  ๋ง์ด์ฃ . ์ด๋Ÿฐ ๋“ฑ๋“ฑ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒƒ์ด ํ”„๋กœํ† ์ฝœ(Protocol)์ž…๋‹ˆ๋‹ค. ๋“œ๋””์–ด ๋ฉ”์ธ ์ฃผ์ œ๊ฐ€ ๋‚˜์˜ค๋„ค์š” ใ…Žใ…Ž
    ๋’ท๋ถ€๋ถ„์€ 2ํŽธ์—์„œ ์ด์–ด์„œ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!
    Ref: https://developer.apple.com/videos/play/wwdc2015/408/
  • ์ด๋Ÿฐ ํŠน์ง•๋“ค์ด ์™œ Cocoa์—์„œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฌด์กฐ๊ฑด ์ˆ˜ํผํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์•ผํ•œ๋‹ค.
    • ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ๋ฒ„๊ฑฐ์›Œ์ง„๋‹ค.
    • ์ˆ˜ํผํด๋ž˜์Šค์˜ ๋ถˆ๋ณ€์„ฑ์„ ์นจ๋ฒ”ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋งŒ์•ฝ์— ๋ชจ๋ธ์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ถ”์ƒํ™”๋ฅผ ํ•„์š”๋กœํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ์ด ๊ฐœ๋…๋“ค์„ ๋ชจ์•„์„œ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํด๋ž˜์Šค์ธ ๊ฒฝ์šฐ๋Š” ํž˜๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ž˜์Šค๋Š” ๋‹จ์ผ ์ƒ์†์œผ๋กœ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋ชจ๋‘ ๋‹ด๊ฒŒ๋˜๋ฉด ํด๋ž˜์Šค๊ฐ€ ๋น„๋Œ€ํ•ด์ง‘๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋งŒํผ ์ถ”์ƒํ™”๊ฐ€ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
  • ์ด์•ผ๊ธฐ๋ฅผ ์ด์–ด๊ฐ€๋ฉด, ์—ฌ๊ธฐ์—์„œ Cocoa ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ณต๊ฐ์„ ์ด๋„๋Š”๋ฐ ์•„์‰ฝ๊ฒŒ๋„ ์ €๋Š” ์•„์ง ๊ณต๊ฐ์ด ์•ˆ๋ฉ๋‹ˆ๋‹ค.. ์ €๋„ ๋ฐ•์ˆ˜๋ฅผ ์น  ์ˆ˜ ์žˆ๋Š” ๋‚ ์ด ์–ผ๋ฅธ ์˜ค๋ฉด ์ข‹๊ฒ ๋„ค์š”.
  • ์ด ๊ทน๋‹จ์ ์ธ ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ •๋ณด๋ฅผ ๋ณด๋Š” ๊ด€์ ์€ ๊ฐœ์ฒด๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ์ •๋ณด๊ฐ€ ๊ณต์œ ๋˜๋ฏ€๋กœ์จ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ๋‹ค๋ฅธ ๋Œ€์ƒ์—๊ฒŒ ํฐ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์„ค๋ช…ํ•œ ์˜ˆ์‹œ๋ฅผ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • Crusty(Dave๊ฐ€ ์—ฐ๊ธฐํ•˜๋Š”..)๊ฐ€ ์—ฌ๊ธฐ์— ๋Œ€๋‹ตํ•ฉ๋‹ˆ๋‹ค!
  • But the real magic happens when the superclass author breaks out a tiny part of that operation into a separate customization point that the subclass can override, and this customization is overlaid on the inherited implementation. That allows the difficult logic to be reused while enabling open-ended flexibility and specific variations.
  • ์ƒ์†์˜ ๊ฒฝ์šฐ ๋ณต์žกํ•œ ๋กœ์ง์˜ ๊ตฌ์กฐ์—์„œ๋„ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜์— ๋งž๊ฒŒ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋‹ค๋ฉด ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ํŽธํ•˜๊ฒŒ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ•๋ ฅํ•œ ํˆด์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์–ด์„œ ๋งํ•˜๋ฉด Swift์—์„œ๋Š” ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž…์ด ์ผ๊ธ‰ ๊ฐ์ฒด์ด๋ฏ€๋กœ ์œ„์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ๊ตณ์ด ํด๋ž˜์Šค์—ฌ์•ผํ•˜๋‚˜? ๋ผ๋Š” ๋ง์ž…๋‹ˆ๋‹ค.
  • He let all the air out of my balloon
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG more
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ