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

๋ฐ˜์‘ํ˜•

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


๐ŸŽฏ ํ”„๋กœํ† ์ฝœ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(์ดํ•˜ POP) {2ํŽธ - Start with Protocol}



๐Ÿ”จ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ƒ์† ๊ด€๊ณ„๋ฅผ ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•ด๋ณด๊ธฐ


  • ์šฐ์„  1ํŽธ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฌธ์ œ ์ƒํ™ฉ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ Ordered๋ฅผ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ํ”„๋กœํ† ์ฝœ๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    ํ”„๋กœํ† ์ฝœ๋กœ ๋ณ€ํ•œ๋‹ค๋ฉด XCode๋Š” ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๋„์›๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์•ˆ๋œ๋‹ค๊ณ  ๋ง์ด์ฃ . ์—ฌ๊ธฐ์„œ Dave๊ฐ€ ํ•œ ๋ง์„ ์ธ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    Okay, first, we need a protocol, and right away Swift complains that we can't put a method body here, which is actually pretty good because it means that we're going to trade that dynamic runtime check for a static check, right, that precedes as implemented.


    ํ•ด์„ํ•ด๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ง์ ‘ ๊ตฌํ˜„์„ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ์จ dynamic runtime check๋ฅผ static check๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ข‹๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•˜๋„ค์š”. ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” dynamic runtime check์™€ static check๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?


    ๐Ÿง Static test vs Dynamic test

    • Static test: ์ •์  ํ…Œ์ŠคํŠธ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๊ฒ€ํ† ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์ „์— ๊ฒ€์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋นŒ๋“œ ์ด์ „์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค).
    • Dynamic test: ํ”„๋กœ๊ทธ๋žจ์˜ ์‹ค์ œ ๋™์ž‘์„ ํ™•์ธํ•จ์œผ๋กœ์จ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฃŒํ˜• ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋นŒ๋“œ ์ดํ›„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค).


    ์ด ๊ธฐ์ค€์œผ๋กœ Dave์˜ ๋ง์„ ๋‹ค์‹œ ํ•ด์„ํ•ด๋ณด๋ฉด "๋ฉ”์†Œ๋“œ๊ฐ€ ๋ชจ๋‘ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ์‹คํ–‰์‹œ ์ฒดํฌ๋ฅผ ํ•ด๋ณด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์„ธ๋งŒ ํ•ด๋†“์Œ์œผ๋กœ์„œ ์ •์  ์ฒดํฌ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค"๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒŒ ์™œ "pretty good"ํ•œ trade์ธ์ง€๋Š” ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


    ๊ณ„์†ํ•ด์„œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ๋‚˜๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


    ํ”„๋กœํ† ์ฝœ๋กœ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ์จ ๋”์ด์ƒ override์˜ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ฏ€๋กœ func precedes๋Š” override๊ฐ€ ์•„๋‹ˆ๊ฒŒ๋˜๊ณ , ํด๋ž˜์Šค์˜€๋˜ Number๋„ ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์—†์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— class์ด์–ด์•ผํ•  ๋‹น์œ„์„ฑ์ด ์‚ฌ๋ผ์ ธ struct๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ ์ด๋ฏธ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์ด๊ณ , ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ๋ฐœ์ „์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ๋‚˜์€ ์ฝ”๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํ•œ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



    Number ํƒ€์ž…์— ๊ตฌํ˜„๋˜์–ด์žˆ๋Š” precedes ๋ฉ”์†Œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ Number๋กœ ๋ฐ”๊พธ๋ฉด ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ† ์ฝœ Ordered์— ๋ช…์„ธ๋œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ”„๋กœํ† ์ฝœ์˜ precedes ๋ฉ”์†Œ๋“œ์˜ other์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ Number๋กœ ๋ฐ”๊พธ๋ฉด ๋ ๊นŒ์š”? ๋ฌผ๋ก  ๋‹น์žฅ ๋™์ž‘ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ํ•˜์ง€๋งŒ, ์• ์ดˆ์— ์ด๋Ÿฌํ•œ ํ”„๋กœํ† ์ฝœ์ด ์„ค๊ณ„๋œ ๋ชฉ์ ์—๋Š” Number๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํƒ€์ž…๋„ ์ด ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ๋„ ์žˆ์„ํ…๋ฐ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„์ด ๋˜๋ฉด ์–ด๋–ค ํƒ€์ž…์ด๋“  Number๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ›์•„์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ฃ . ๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.



    Dave๋Š” ํ”„๋กœํ† ์ฝœ ์•ˆ์— ์ •์˜๋œ Self๋ฅผ "์ž๊ธฐ ์ž์‹ ์„ ์ฑ„ํƒํ•  ํƒ€์ž…์„ ์œ„ํ•œ Placeholder"๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ต‰์žฅํžˆ ์ข‹์€ ํ‘œํ˜„ ๊ฐ™๋„ค์š”!

    ๊ทธ๋Ÿผ ์ด์ œ ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  Binary Search ๋กœ์ง์„ ๋ณผ๊นŒ์š”?



    ์•ž์„  ๋ณ€๊ฒฝ์  ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Dave์˜ ๋ง์— ๋”ฐ๋ฅด๋ฉด, ํ˜„์žฌ heterogeneous array์ด๊ธฐ ๋•Œ๋ฌธ์ด ์ด๊ฒƒ์„ XCode๊ฐ€ homogeneous array๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฉ์–ด๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด heterogeneous๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ณ , homogeneous๋Š” ์„œ๋กœ ๊ฐ™์€ ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ํƒ€์ž…์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ฒฝ์šฐ homogeneous array, ๋‹ค๋ฅธ ๊ฒฝ์šฐ heterogenous array๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฆ‰, Ordered๋Š” ํ”„๋กœํ† ์ฝœ์ด๋ฏ€๋กœ Ordered๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ํƒ€์ž…์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ € ๋ฐฐ์—ด์€ ๋”์ด์ƒ homogeneousํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

    ๋ณ€๊ฒฝ ํ•œ ํ›„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.



    ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•ด์„œ Ordered๋ฅผ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž… T๋ฅผ ๊ณ ์ •ํ•˜๊ณ , ๊ทธ ํƒ€์ž…์— ๋Œ€ํ•ด ํ• ๋‹นํ•ด์ฃผ์—ˆ์œผ๋‹ˆ ์ด์ œ [T]๋Š” homogeneous ํ•ฉ๋‹ˆ๋‹ค.

    Self Requirement๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋ฅผ ํ‘œ๋กœ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.



    heterogeneous์™€ homogeneous์˜ ์„ค๋ช…์€ ์œ„์—์„œ ํ–ˆ์œผ๋‹ˆ ๋„˜์–ด๊ฐ€๊ณ , Self๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ชจ๋ธ๋“ค ๊ฐ„์— ์ƒํ˜ธ ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋กœ์ง์ด ๊ตฌํ˜„๋  ๋•Œ ์ƒํ˜ธ๊ฐ„์— 'interaction'์ด ๊ฐ€๋Šฅํ•œ ๊ด€๊ณ„์ธ์ง€๋ฅผ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”๋ฐ ๋‹ค๋ฅธ ํƒ€์ž…์ผ ๊ฒฝ์šฐ ์ผ์ผ์ด ๊ทธ ์ƒํ™ฉ๋“ค์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

    ๋‹ค์Œ์œผ๋กœ๋Š” Dynamic/Static dispatch์ธ๋ฐ ์šฐ์„  ์ด ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    Dispatch: ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •

    Static Dispatch(์ •์  ๋””์ŠคํŒจ์น˜): ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ์‹œ ์–ด๋–ค ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•„๋Š” ๊ฒƒ.

    Dynamic Dispatch(๋™์  ๋””์ŠคํŒจ์น˜): ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”์ง€ ๋ชจ๋ฆ„. ์ถ”์ƒ ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํ• ๋‹น๋œ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๋ณด๊ณ  ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰.


    ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” [Ordered]์˜ ๊ฒฝ์šฐ Ordered์— ๋ช…์‹œ๋œ ๋ฉ”์†Œ๋“ค์€ ๊ฐ™์€ ์ด๋ฆ„์ด์ง€๋งŒ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋Š” ํƒ€์ž…์— ๊ตฌํ˜„๋˜์–ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ Self๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ†ต์ผ๋˜์–ด์žˆ๋Š” ๋‹จ์ผํ™” ๋œ ๊ทธ ๊ฐ์ฒด์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Staticํ•œ Dispatch๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ heterogenousํ•˜๋‹ค๋ฉด ์–ด๋–ค ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผํ• ์ง€ ๋Ÿฐํƒ€์ž„์‹œ ๊นŒ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Dynamicํ•˜๋‹ค๊ณ  ํ‘œํ˜„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    Dave์˜ ํ‘œํ˜„์„ ์ง์ ‘ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    We trade dynamic polymorphism for static polymorphism, but, in return for that extra type information we're giving the compiler, it's more optimizable.

    dynamic์ด staticํ•œ ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœํ•ด์„œ ํƒ€์ž…์—๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์คŒ์œผ๋กœ์จ ๋” ์ตœ์ ํ™”๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ Document and Display model์„ OOP์™€ POP๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ


  • Crusty๋Š” ์—ฌ๊ธฐ๊นŒ์ง€ ์„ค๋ช…ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ .. ์•„์ง ํ”„๋กœํ† ์ฝœ์„ ๋ชป ๋ฏฟ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ํ”„๋กœํ† ์ฝœ์ด ์™„์ „ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„๊นŒ์— ๋Œ€ํ•œ ์˜๊ตฌ์‹ฌ์ด ๋‚จ์•„์žˆ๋‚˜๋ด์š”. ๊ทธ๋ž˜์„œ Dave๋Š” ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด Crusty๋ฅผ ์„ค๋“ํ•˜๋Š” ์…€ํ”„ ์—ฐ๊ธฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Document and Display ๋ชจ๋ธ์„ ํ†ตํ•ด ํ”„๋กœํ† ์ฝœ์˜ ๊ฐ•๋ ฅํ•จ์„ ๋ณด์—ฌ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.



    ์œ„๋Š” Crutsy๊ฐ€ ์ž‘์„ฑํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. Drawing์— ๊ด€๋ จ๋œ ๊ฒƒ์ธ๋ฐ 1ํŽธ์— ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Crusty๋Š” GUI๋ฅผ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ ํ”„๋ฆฐํŒ…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

    ์šฐ์„  ํ”„๋กœํ† ์ฝœ์„ ์ƒ์„ฑํ•ด์„œ ๊ทธ๋ฆผ์— ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.


    ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ด…๋‹ˆ๋‹ค!



    ์งœ์ž”! Crusty๊ฐ€ ๊ทธ๋ฆผ์ด ์™„์„ฑ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Dave๋‚˜ ์ œ ๋ˆˆ์—๋Š” ๊ทธ๋ฆผ์œผ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ทธ๋ ‡๊ฒ ์ฃ . Dave๋Š” ํˆฌ๋œ๋Œ€๋ฉด์„œ ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.


    3ํŽธ์—์„œ ์ด์–ด์„œ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!


    Ref: https://developer.apple.com/videos/play/wwdc2015/408/

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG more
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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
๊ธ€ ๋ณด๊ด€ํ•จ