ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ณต๋ถํ๋ค๋ณด๋ฉด ๋ฒฝ์ ํ๋ฒ ๋ง์ฃผํ๋ค. Functor์ Monad๊ฐ ๊ทธ๊ฒ์ด๋ค. ์ด๊ฑธ ์ดํดํ๊ธฐ ์ํด์ ์ํคํผ๋์์์ ์งํฉ๋ก ?, ๋ฒ์ฃผ๋ก ? ์ด๋ฐ ๊ฑธ ์ฝ์๋ ์ ์ด ์๋ ๊ฒ ๊ฐ์๋ฐ ์ฌ์ ํ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์ด๋ฒ์๋ ์๋ฟ๋ ๋ฐฉ์์ผ๋ก ์ดํดํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
Functor
-
optional์ map
- ๊ฐ์ด ์์ผ๋ฉด ์คํ, ์์ผ๋ฉด ๋ง์
-
Collection์ map
- ๊ฐ์ ํ๋์ฉ ๊ฐ์ง๊ณ ์์ ๋งคํํด๋ผ
-
Dictionary์ map
- ๊ฐ ๋์ ๋๋ฆฌ์ key, value๋ฅผ tuple๋ก ๋ค๊ณ ์์ ๋งคํํด๋ผ
-
function์ map
- Composition ํด๋ผ
-
map์ ์ด์ฉํ transform์ ์ง์ํ๋, value๋ฅผ ๊ฐ์ง๋ context
-
Context + value + transform(map) = Functor
- context
- ์ด๋ค value๊ฐ ์ฒํด์๋ ์ํ
- Collection, Optional ๋ฑ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง๋ Container
- ํฌํจํ๋ value๊ฐ generic์ผ๋ก ํํ๋์ด์ผ ํจ
- value
- Context์ ๋ฃ์ด์ง๋ ์ค์ ๋ด์ฉ
- Context๊ฐ generic์ผ๋ก ํํ๋๊ธฐ ๋๋ฌธ์, ์ด๋ค type์ value๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Transform
- ์ด๋ค ๊ฐ T๋ฅผ U๋ก ๋ณํํด์ฃผ๋ function
- T์ U๋ ๊ฐ์ Type์ด์ด๋ ๊ด์ฐฎ์
- ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํจ
- ์คํจํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ๋ flatMap์ด ๋์
- context
-
Context์ ์ธ์ฌ์๋ Value์ function์ ์ ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ
-
Optional
- Box๋ก ์ดํดํ๊ธฐ
- ์ด๋ฐ Optional(Context)์๋ค๊ฐ ์ฐ์ฐ์ ์ํํ๊ธฐ ์ํด์๋ guard, if์ ๊ฐ์ด Optional Unwrapping์ ํด์ฃผ์ด์ผ ํจ
-
Map์ ์ฌ์ฉํ๋ฉด, Optional Unwrapping์ด ์์ด ๊ฐ์ ํ์ ์ผ๋ก ๋ณํ์ด ๊ฐ๋ฅํจ
- 5๋ฅผ ๋ฆฌํดํ์ผ๋, map์ ๊ฒฐ๊ณผ๋ Optional(5)
-
๋์ ์ดํดํ๊ธฐ
- Value๊ฐ ์๋ ๊ฒฝ์ฐ
- Optional(2) โ Context๋ก ๋ถํฐ Unwrapping โ 2 โ ํจ์ ์ ์ฉ(+3) โ 5 โ Context์ Rewrapping โ Optional(5)
- Value๊ฐ ์๋ ๊ฒฝ์ฐ
- nil โ ๊ฐ ์์ ํ์ธ โ ํจ์ ์ ์ฉํ์ง ์์ โ ๊ทธ๋๋ก ๋ฆฌํด(nil)
- Value๊ฐ ์๋ ๊ฒฝ์ฐ
-
-
Chaining
- Optional Chaining
let result = a?.b?.c?.d?.e
- Map Chaining
let result = a.map { $0 }.map { $0 }.map { $0 }.map { $0 }
- ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ Context๊ฐ ์๋ฐ๋๊ธฐ ๋๋ฌธ(Box)
- ์๋ฏธ
- Value๊ฐ ์๋ ์์ธ ์ํฉ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ฃผ logic์์ ์ ๊ฑฐํ์ฌ ๋ฐ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Step์ ๋ช ํํ๊ฒ ๋ณผ ์ ์์
- ํ์์ Code๋ฅผ ์์ ๋จ์์ ํจ์๋ก ๋ถ๋ฆฌํด์ผ ์ ์ฉ ๊ฐ๋ฅ
- ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋์์ง
- Optional Chaining
-
Function์ map ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์๊น?
-
์ฆ, Function์ญ์ Context์ธ๊ฐ?
-
Function์ map์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ Function์ composition ํ๋ค๋ ์๋ฏธ
- A โ B ํจ์์ B โ C ํจ์๋ฅผ ํฉ์ฑํด์ A โ C ํจ์๋ฅผ ๋ง๋ค์ด๋ผ
-
-
Result Functor
- Optional์ ๊ฐ์ด ์๊ฑฐ๋ ์๊ฑฐ๋
- ํ์ง๋ง ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ ์์๋ณด๊ธฐ ์ํด์ Optional๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ๋ณด๋ฅผ ๋ง์ด ์ ๊ณตํ์ง ๋ชปํ๋ค.
- ๊ทธ๋ฐ๋ฐ case๋ง ๊ฐ์ง๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ์ธ ๊ฒฝ์ฐ, ์ค์ ์ฌ์ฉํ ๋, switch ๋ฌธ์ ํตํด์ ๊ณ์ ํ๋จํด์ค์ผ ํ๋ค. ์ง์ ๋ถ ํ๋ค.
- switch ๋ฌธ์ ์ค์ ๋ก์ง์์ ์ฌ์ฉํ๊ณ ์ถ์ง ์์์
- ๊ทธ๋์ ๋ด๋ถ์ map ํจ์๋ฅผ ๋์ ํด์(๋ฆฌํด๊ฐ์ ๋ณด๋ฉด context๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ map์ด ๋ง๋ค) ๊ฐ๊ฒฐํ๊ฒ ํด๊ฒฐํ๊ณ ์ ํจ
- ํ์ฉ
Monad
- flatMap์ ์ด์ฉํ transform์ ์ง์ํ๋ value๋ฅผ ๊ฐ์ง๋ context
- Context + value + flatMap transform = Monad
- map์ Context๋ฅผ ์ ์งํจ
- transform์ ๊ฒฐ๊ณผ์ ์๊ด์์ด ๋ฐ์ค์์ ๋ค์ ๋ฃ์(Context)
- ๊ทธ๋์ ์์ ์ค๋ช
์, ๋ชจ๋ ๋ณํ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ผ ํ๋ ๊ฒ์
- ์ฌ์์ด ๊ฐ์ ์งํฉ๋ด์์ ์์ ํ๊ฒ ์ด๋ค์ง๋ ๊ฒ์ ๋ฐ๋
- ๋ง์ฝ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ (transform์ ๊ฒฐ๊ณผ๊ฐ nil์ด๋ผ๋ฉด)์๋ transform์ ๊ฒฐ๊ณผ์ธ nil์ ๋ค์ ์์์ ๋ฃ๋(Context) ์ํฉ์ด ์ด๋๋จ
- ์ฆ, transform์ output์ด Optional์ธ ์ํฉ์ ๋งํจ
Optional(nil)
,Optional(Optional(3))
- ์ด๋ฐ ๊ฒฝ์ฐ๋ ๋ณดํต ๋ฐ๋ผ์ง ์๋ ์ํฉ์ผ ๊ฒ์
nil
,Optional(3)
์ ์ํจ
- ์ด ๊ฒฝ์ฐ, map์ ์ฐ์ฐ์ ํ๋, nil์ธ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ flatten์ ์ญํ ์ด ํ์ํจ
- ์ด ๋ ์ญํ ์ ์ํํ๋ ๊ฒ์ด flatMap์
- Monad ํ์ฉ
-
์๋ฒ๋ก ๋ถํฐ ๋ฐ์ Data๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ์
{ "age": 3, "name": "kim" }
-
JSON Parser ํ, Struct๋ก ๋ณํ
-
๊ธฐ์กด ์ฝ๋
-
๋ณ๊ฒฝ๋ ์ฝ๋
- ๋๋ฌด๋ ๊ฐ๊ฒฐํด์ก๋ค.
-
๊ฒฐ๋ก
- ์์
์์
- ๋ช ํํ ์์ ๋จ์์ function์ผ๋ก ๋ถ๋ฆฌํ๋ค.
- Data์ Mapping์ map, flatMap์ Chaining์ผ๋ก ์ฒ๋ฆฌ
- ๊ฒฐ๊ณผ์ ๋ํ ํ๋จ์ ์ต์ข ์ ์ผ๋ก transform๋ ๋ด์ฉ์ ๋ณธ๋ค.
- ์ฅ์
- ๊ฐ ๋จ์ function์ด ๋ช ํํด์ง๊ณ Testํ๊ธฐ ์ฉ์ดํด์ง
- ๋ณธ์ฐ์ ๋ก์ง์ด ๋ช ํํ๊ฒ ๋๋ฌ๋จ
- ๋ฐ๋ณต์ ์ผ๋ก ๋์จ ์์ธ์ฒ๋ฆฌ ์ฝ๋๋ค์ด ์ฌ๋ผ์ง
- ์์
์์
-