본문 바로가기
Languages/Swift

사당 iOS 스터디 3주차 - 모나드

by 탄이. 2018. 8. 17.

CHAPTER 16 모나드

모나드는 특정한 상태로 값을 포장하는 것에서 출발

함수객체와 모나드는 특정 기능이 아닌 디자인 패턴 혹은 자료구조라고 할 수 있습니다.

__16.1 컨텍스트

‘콘텐츠’를 담은 그 무엇인가’를 뜻합니다.

옵셔널은 some과 none이라는 두 가지의 컨텍스트를 갖습니다.

__16.2 함수객체

옵셔널은 컨테이너(컨텍스트가 일종의 컨테이너 역할을 합니다)와 값을 갖기 때문에 맵 함수를 사용할 수 있습니다.

‘함수객체란 맵을 적용할 수 있는 컨테이너 타입’

Array, Dictionary, Set 등등 스위프트의 많은 컬렉션 타입이 함수객체

옵셔널 map 메서드 구현

  • Optional(2).map(addThree)

  • Optional.none.map(addThree)

__16.3 모나드

모나드는 함수객체의 일종으로 맵 함수를 적용할 수 있는, 즉 맵 함수를 지원하는 컨테이너 타입

거기에 더 나아가 값이 있을지 없을지 모르는 상태를 추가

즉, 모나드는 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 갖는 함수객체 타입

플랫맵

  • 플랫맵은 포장된 값을 받아서 값이 있으면 포장을 풀어서 값을 처리한 후 포장된 값을 반환하고, 값이 없으면 없는 대로 다시 포장하여 반환

  • 맵과 플랫맵의 차이

    • 내부의 값을 알아서 추출해준다는 것

    • 플랫맵은 내부에 포장된 값도 추출해낼 수 있습니다.

      • 맵 메서드를 사용한 결과는 Array 컨테이너 내부의 값 타입이나 형태가 어찌 되었든, Array 내부에 값이 있으면 그 값을 그저 클로저의 코드에서만 실행하고 결과를 다시 Array 컨테이너에 담기만 합니다.

      • 플랫맵을 통해 클로저를 실행하면 알아서 내부 컨테이너까지 값을 추출

      • mappedArr

        • [Int?] 타입

      • flatmappedArr

        • [Int] 타입

  • 중첩된 컨테이너에서 맵과 플랫맵의 차이

    • 플랫맵은 내부의 값을 1차원적으로 펼쳐놓는 작업도 하기 때문에, 값을 꺼내어 모두 동일한 위상으로 펼쳐놓는 모양새

    • 값을 일자로 평평하게 펼친다고 해서 플랫맵

  • 플랫맵의 활용

    • 맵을 사용하여 체인을 연결하면 옵셔널의 옵셔널 형태로 반환

    • 플랫맵은 함수의 결괏값에 값이 있다면 추출해서 평평하게 만드는 과정을 내포하고, 맵은 그렇지 않기 때문

    • 플랫맵은 추출 작업을 통해 옵셔널에서 꺼내온 값을 다시 옵셔널에 넣어주기 때문에 이같은 연쇄 연산도 가능

  • 옵셔널 바인딩을 통한 연산

    • 만약에 플랫맵을 사용하지 않으면서도 플랫맵과 같은 효과를 얻으려면 바인딩을 직접 해주어야 합니다.

  • 플랫맵 체이닝 중 빈 컨텍스트를 만났을 때의 결과

    • 플랫맵은 체이닝 중간에, 연산에 실패하는 경우나 값이 없어지는 경우(.none이 된다거나 nil이 된다는 등) 이외에는 별도의 예외 처리없이 빈 컨테이너를 반환

    • 바로 옵셔널이 모나드이기 때문에 가능한 것

옵셔널 체이닝, 옵셔널 바인딩, 플랫맵 등은 모나드와 관련된 연산





참고


야곰의 스위프트 프로그래밍 https://book.naver.com/bookdb/book_detail.nhn?bid=12571019

댓글