모나드에 대해서 공부하기 전에 몇가지 개념에 대해 짚고 넘어가야 한다.
사실 잘 이해가 되지 않았고 지금도 잘 이해하고 있다고 생각하지 않는다.
하지만 정말 너무 잘 설명되어있는 글을 통해 조금 더 이해할 수 있었던 것 같다. (아래 사이트 참고!)
우선, 모나드가 갖춰야 하는 조건이 있다.
타입을 인자로 받는 타입 (특정 타입의 값을 포장)
특정 타입의 값을 포장한 것을 반환하는 함수가 존재
포장된 값을 변환하여 같은 형태로 포장하는 함수가 존재
컨텍스트 (Context)
컨텍스트는 컨텐츠를 담은 그 무언가, 어떤 위치에 값이 존재할 수 있는 맥락 이라고 말한다.
예를 들어 설명하자면 물이 담겨있는 물컵을 생각했을 때
물 : 컨텐츠
물컵 : 컨텍스트
라고 생각하면 된다.
옵셔널에 대해서 공부했을 때를 떠올리면 더 쉽게 이해할 수 있다.
옵셔널은 값이 있을 수도 있고 없을 수도 있는 타입이다.
함수 객체 (Functor)
함수 객체는 고차 함수인 map 을 적용할 수 있는 컨테이너 타입 이라고 한다.
Array, Dictionary, Set 등이 컨테이너 타입, 함수 객체라고 할 수 있다.
왜 함수 객체가 map 을 적용해야 하는지 다음 예를 통해서 확인해볼 수 있다.
옵셔널 Int 타입인 number 변수가 있다.
number 에 3을 더해주려고 한다.
하지만 3은 Int 타입이기 때문에 위에서 보는 것과 같이 타입이 달라 에러가 발생한다.
여기서 number 는 컨텍스트이기 때문에 값이 있는지 없는지 모른다.
만약 값이 있다면 연산하기 위해서는 안에 있는 값을 꺼내어 연산을 해주어야 한다.
그렇기 때문에 3 을 더할 수 없다.
이때 map 을 통해서 옵셔널 타입인 number 안의 값을 꺼내 연산을 할 수 있다.
print(number.map({ $0 + 3 })) // Optional(5)
map 메서드를 통해 해당 요소를 하나씩 확인하면서 "값" 을 꺼내어 연산을 할 수 있다.
그런데 결과를 확인해보니 5 가 아닌 Optional(5) 인 것을 볼 수 있다.
이유는 map 메서드가 연산한 결과를 컨텍스트에 넣어주기 때문이다.
정리해보면 옵셔널은 컨텍스트 타입이고 옵셔널은 map 을 적용할 수 있기 때문에 함수 객체라고 할 수 있다.
모나드 (Monad)
그럼 모나드는 무엇일까?
모나드는 함수 객체의 일종 이다.
함수 객체는 맵 함수를 적용할 수 있는 컨테이너 타입 이고 추가로 값이 있는지 없는지 모르는 상태를 추가한다.
다시 말해, 모나드는 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 가지는 함수 객체 타입이다.
옵셔널을 통해 쉽게 이해할 수 있다.
옵셔널은 값이 있는지 없는지 알 수 없는 타입이면서 map 을 적용할 수 있는 함수 객체다.
따라서 옵셔널은 모나드라고 할 수 있다.
추가적으로 모나드에서는 flatMap 을 적용할 수 있다.
flatMap가 map 과 다른 점은 내부의 값을 알아서 더 추출 해준다는 것이다.
그리고 1차원 위상화? 를 해준다.
다음의 예를 통해 확인해볼 수 있다.
let mappedArray = optionalArray.map{ $0 }
let flatmappedArray = optionalArray.flatMap{ $0 }
print(mappedArray)
print(flatmappedArray)
========== 출력 결과 ==========
[Optional(1), Optional(2), nil, Optional(4)]
[1, 2, 4]
map 은 한 번만 추출해 값을 가져오지만 flapMap 은 알아서 더 추출해내는 것을 확인할 수 있다.
그리고 자세히 보면 flatMap 은 nil을 배재한 것을 확인할 수 있었다.
또 알아서 더 추출한다는 것을 알 수 있었고 nil 을 거르는 기능까지 있다는 것을 알 수 있다.
마지막으로 더 추가적으로 공부해서 정리해야 할 것 같다.
- 참고 사이트 -
oaksong.github.io/2018/01/31/flatmap/
'iOS > Swift' 카테고리의 다른 글
[Swift] 부스트코스 스위프트 기초 강의 수료 👏👏👏 (0) | 2020.12.07 |
---|---|
[Swift] 추가적으로 공부해야할 것들 정리 (0) | 2020.12.07 |
[Swift] 28. 고차 함수 (map, filter, reduce) (0) | 2020.12.07 |
[Swift] 27. 오류 처리 (0) | 2020.12.04 |
[Swift] 26. 익스텐션 (extension) (0) | 2020.12.03 |