ํฐ์คํ ๋ฆฌ ๋ทฐ
[WWDC 15] - Protocol Oriented Programming(POP) {2ํธ - OOP๋ฅผ POP๋ก ๋ณ๊ฒฝํด๋ณด๊ธฐ}
B_log 2021. 5. 23. 15:04๐ ํ๋กํ ์ฝ ์ค์ฌ ํ๋ก๊ทธ๋๋ฐ(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ํธ์์ ์ด์ด์ ์งํํ๊ฒ ์ต๋๋ค!
'iOS ์ฑ๊ฐ๋ฐ > WWDC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WWDC 20] - # 10028 Meet WidgetKit(2) (0) | 2022.05.04 |
---|---|
[WWDC 20] - # 10028 Meet WidgetKit(1) (0) | 2022.05.04 |
[WWDC 21] #10216 ARC in Swift: Basics and beyond(ARC์ ๊ดํ์ฌ) (0) | 2022.02.22 |
[WWDC 21] - # 10132 Meet async/await in Swift(Swift ๋น๋๊ธฐ) (0) | 2022.02.10 |
[WWDC 15] - Protocol Oriented Programming(POP) {1ํธ - ์ OOP๋ก๋ ๋ถ์กฑํ๊ฐ?} (0) | 2021.05.20 |
- Total
- Today
- Yesterday
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- N์ผ๋ก ํํ#DP#Programmers#Python
- filter#isalnum#lower
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Swift#Tuples#Range
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- PassingCars#Codility#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ์ํธ์ฝ๋#dp#BOJ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- ์์ด์ฌ์ดํด#BOJ#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Triangle#Sorting#Codility#Python
- django#slicing
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- API#lazy#
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- Brackets#Stacks and Queues#Codility#Python
- Distinct#Codility#Python
- django
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |