[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Swift

[Swift] Monad

inu 2022. 3. 1. 17:52
반응형

Context

Swift의 Monad에 대해 이해하기 위해서는 먼저 Context와 Content의 관계에 대해 이해해야 합니다. Content는 Context에 들어갈 수 있는 '어떤 것'이며, Context는 Content를 보관할 수 있는 '어떤 것'입니다. 상당히 포괄적인 개념이기에 저 그림에 보여지는 관계정도만 이해해도 충분합니다. 어쨌든 핵심은 Context에 무언가를 담을 수 있다는 것이죠.

  • Collection들은 Context입니다. 내부에 인자들을 담을 수 있기 때문입니다.
  • Optional 또한 Context입니다. 내부에 값을 보유할 수 있기 때문입니다.

Functor

다음으로 알아야하는 것은 Functor입니다. Functor는 고차함수 map을 적용할 수 있는 모든 컨테이너 타입을 의미합니다. 위 그림처럼 어떤 형태로든 내부에 값을 보유하여 이를 꺼내고 연산을 수행한 다음 다시 이를 넣어 반환하는 것입니다.

  • 다들 익숙하게 사용하셨듯, Collection들은 Functor입니다.
  • Optional 또한map을 적용할 수 있기 때문에 Functor입니다. Optional 박스 내부에서 값을 꺼내 연산을 적용시킨다고 생각하면 이해가 바로 되네요.

Swift - Monad

Monad는 이런 Functor의 일종입니다. Functor가 내부에 값이 존재할지 안할지 알 수 없는 상태일 경우 이를 Monad라고 표현합니다. 즉, Monad는 값이 있을 수도 있고 없을 수도 있는 Context를 가지는 Functor입니다.

  • 그렇게 생각하면 배열은 Monad가 아닙니다.
  • 하지만 Optional은 Monad입니다. 내부에 값이 존재할 수도 있고 안할 수도 있는 것이 옵셔널의 정의였기 때문에 당연하다는 생각도 듭니다.

Monad를 공부하고나니 flatMap을 사용했을 때 왜 Optional이 벗겨지는지 더 와닿았습니다. 결국 Optional도 Context를 보유한 객체기 때문에 그 Context에서 값을 빼오는 것이 Collection에서 Context를 벗기는 것과 큰 차이가 없다고 자연스럽게 받아들여지네요!


참고

반응형

'🍎 Apple > Swift' 카테고리의 다른 글

[Swift] NotificationCenter  (0) 2022.03.07
[Swift] KVC(Key-Value Coding), KVO(Key-Value Observing)  (0) 2022.03.01
[Swift] Property Wrapper  (0) 2022.02.24
[Swift] Copy on write  (2) 2022.01.26
[Swift] 문자열 처리  (0) 2022.01.22