Swift

Swift | 고차함수 map / faltmap / compactmap에 관하여

ziziDev 2024. 5. 21. 11:02
반응형

안녕하세요 오늘은

고차함수에 관하여 정리하고자 합니다

 

map/flatmap/compactmap

 

여러가지가 있는데요

여기에 관하여 특징과 사용방법에 관하여 알아볼까요?

 

map

|

각 요소에 대해 동일한 연산을 수행하고 그 결과를 새로운 컬렉션으로 반환하는 고차함수

 

 

 

함수를 인자로 받아 각 요소에 함수를 적용하고 그 결과 새로운 컬렉션을 반환하기 때문에

코드의 간결성과 가독성, 재사용이 용이하고 컴파일러 최적화를 하기위한 성능에 좋다는 장점이 있습니다

 

그리고 기존 데이터를  변형하여 새로운 컨테이너를 만드는데 기존 데이터는 변경되는게 없답니다

 

 

map

기본형식

 

 

T타입의 transform을 받아 새로운 타입의 T타입의 컨테이너를 생성한다는 이야기랍니다

예제를 통해서 좀 더 친숙해보자구용!

 

좀 더 추가적으로 말하자면

T는 generic type을 뜻하고

어떠한 타입으로도 변경이 가능하다고 생각하면 됩니다

현재 int가 input으로 들어가는데 ouput은 연금술사마냥 아무거나 나올 수 있다고 생각하면 편하답니다

 

 

map

예제

 

배열 예제

 

배열을 가지고 새롭게 매핑해서 새로운 배열을 만드는걸 볼 수 있습니다

 

파라미터로 함수를 받아오고 기존의 배열의 각 아이템을 새롭게 매핑하고

매핑방식은 클로저가 제공을 해주는데

여기서 아직 클로저를 배우지 않아서

간단히 말하자면

1급객체 역할을 하고 있는 함수를 축약해서 표현할 수 있는 기능을 가지고 있는 대단한 녀석이란 점 입니다

 

그리고 예시로 정수만 했지만

사실상 어떠한 타입도 가능하답니다

 

그리고 {$0 *$0}은 클로저에서 사용하는 축약기능 중 하나랍니다

알아두면 요긴하게 사용이 가능하답니다:)

 

 

딕셔너리 예제

 

딕셔너리로 사용해서 (key, value) 쌍을 변환하는 과정을 볼 수 있어요

클로저 변수 타입을 명시하지 않아서 조금 더 간결한걸 볼 수 있죠??

map에서 함수 딕셔너리를 사용할 때 (key, value) 쌍을 튜플 형태로

받아들이며 변환결과는 배열로 변환된다는 것을 유의하세요

출력 결과는 두 경우 모두 동일한걸 볼 수 있답니다

 

 

 

flatMap

|
그냥 용어 그대로 각 요소에 대해 매핑된 결과를 평평~~하게 하나의 컬렉션으로 반환합니다

다음으로 faltmap에 대해서 알아보고자합니다

느낌상 평평한맵...?

이란 생각을 다들 할건데요

 

 

중첩된 컬렉션 이중 배열

배열안의 배열을 평탄화 

옵셔널 값을 추출할 때 

아주 유용하게 사용한답니다

 

flatMap

기본형식

 

map이랑 비슷하죠??

하지만 좀 다르답니다

기본 바인딩이 되어서 결과적으로 나오기 때문에

즉 옵셔널을 벗겨서 기본 타입으로 나오기 때문에 편리 합니다

예시를 통해 알아보자구요!

 

 

중첩된 배열이 단일 배열로 만들어지는 과정을 볼 수 있습니다

 

그리고 배열에 옵셔널 nil이 있다면?

매핑이되면서 자동으로 제거되는걸 볼 수 있습니다

 

 

map과 flatMap을 비교하고자

하나의 예시를 만들어보았습니다

 

 

map 클로저 내부에서는 각 원소를 $0으로 받아들입니다

Array(reapeating: $0, count: $0)는

$0의 값은 $0번 반복하라는 배열을 만들게 됩니다

 

 

예를 들어 원소가 2라면

[2,2]가 생성됩니다

 

결과적으로 매핑하게되면

이중 배열로

[[1], [2,2], [3,3,3],[4,4,4,4]]

가 되는걸 볼 수 있습니다

 

반면 flatMap은

 

이차배열로 만들지 않고

[[1], [2,2], [3,3,3],[4,4,4,4]]

중첩된 배열을

단일 배열로 평탄화하여 나열하는걸 볼 수 있습니다

 

마지막으로 compatMap에 대해서 알아보고자 합니다

 

compactMap

|

배열이 단일 배열 다중 배열이건 1차배열로 만들지 않고 형식 그대로 유지하는 성격을 가지고 있습니다

 

 

기존 배열 등 각 아이템을 새롭게 매핑해서 변형하고 옵셔널 요소는 제거하고 새로운 배열을 만들어 냅니다

map + optional 

즉 옵셔널 바인딩 기능이 내장되어있다

다시 말해 옵셔널을 벗겨서 기본 타입으로 나오기 때문에 편리 합니다

바로 예시를 보고 이해해봅시당!

 

 

이렇게 compactMap은 map과 한가지가 다릅니다

map의 경우 nil을 들고오지만

compactMap은 nil인 경우 제거하고 반환합니다

 

 

 

그래서 프로그래머에서도 자주 사용하는 고차함수는

짧게 말해서

보통 map을 많이 사용하지만 optional Type이므로 !를 사용해야하며

compactMap/flatMap 둘 다 기본 옵셔널을 벗겨서 기본 타입으로 나오기 때문에 편리 합니다

 

그리고 flatMap은 다차원배열이라도 1차원으로 만들어주는 녀석이랍니다 :)

 

 

❤️혹시나 잘못된 부분이 있다면 댓글로 알려주면 감사하겠습니다❤️

반응형