새소식

iOS/Swift

[Swift] 모나드

  • -
참조 :  Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)

 

 

 

모나드란?


- 사용하는 곳에 따라 수학의 범주론/특정 디자인 패턴 모나드인지 다름

- 프로그래밍에서의 모나드는 범주론의 모나드의 의미 차용한 정도의 의미를 가짐 → 모나딕(Monadic)이라고 함

- 모나드의 성질을 갖는 타입이나 함수 → 모나드 타입 / 함수

 

- 모나드가 갖춰야 하는 조건

  1. 타입을 인자로 받는 타입(특정 타입의 값을 포장)
  2. 특정 타입의 값을 포장한 것을 반환하는 함수(메서드) 존재
  3. 포장된 값을 변환하여 같은 형태로 포장하는 함수(메서드) 존재

- 스위프트에서 모나드를 사용한 예 중 하나가 옵셔널(Optional)

 

- 닫힌 함수객체(Endofunctor) : 함수객체 중에서 자신의 컨텍스트와 같은 컨텍스트의 형태로 맵핑할 수 있는 함수객체

- 모나드도 닫힌 함수객체

- 함수객체는 포장된 값에 함수를 적용 가능

→ 모나드도 컨텍스트에 포장된 값을 처리하여 포장된 값을 컨텍스트에 다시 반환하는 함수(맵)을 적용 가능

→이런 맵핑을 수행하도록 flatMap 메서드 활용

 

 

 

컨텍스트(Context)


- 컨텍스트 : '콘텐츠(Content)를 담은 그 무엇인가' 를 뜻함

- 값이 없는 옵셔널 상태가 컨텍스트 → '컨텍스트는 존재하지만 내부에 값이 없다'

 

 

 

함수객체(Functor)


- 맵 : 컨테이너의 값을 변형시킬 수 있는 고차 함수

- 옵셔널은 컨테이너와 값을 가지기 때문에 맵 함수를 사용 가능

- 함수객체 : 맵을 적용할 수 있는 컨테이너 타입

 

 

플랫맵(flatMap)


- map(_:)과 flatMap(_:)의 비교

※ compactMap(_:) : flatMap(_:) 메서드를 Sequnce 타입이 Optional 타입의 Element를 포장한 경우에 사용

 

let optionals: [Int?] = [1, 2, nil, 5]

let mapped: [Int?] = optionals.map{ $0 }
let compactMapped: [Int] = optionals.compactMap{ $0 }

print(mapped) // [Optional(1), Optional(2), nil, Optional(5)]
print(compactMapped) // [1, 2, 5]

 

- 내부의 값을 1차원적으로 펼쳐놓는 작업도 함 → 값을 꺼내어 모두 동일한 위상으로 펼쳐놓는 모양새를 갖춤

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

728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] 프로퍼티와 메서드  (0) 2022.09.20
[Swift] 구조체와 클래스  (0) 2022.09.16
[Swift] 옵셔널(Optional)  (0) 2022.09.15
[Swift] 함수  (0) 2022.09.14
[Swift] 연산자  (0) 2022.09.14
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.