iOS/Common

[Swift] 맵 삼형제(map, flatMap, compactMap)에 대해 알아봅시다

TDCIAN 2022. 6. 10. 15:09

클릭하면 3형제 생성기 홈페이지로 이동합니다...(세상엔 참 다양한 서비스들이 있군요...)

 

(1) map

애플 개발자 홈페이지에 있는 map에 대한 설명입니다.

배열 내부의 요소들을 매핑해서 돌려준다네요!

 

그런데 mapping이 뭘까요? 구글에 물어봅시다.

역시 명쾌하다! 구글!

 

여기 말고 이번에는 해시넷에서 봅시다(블록체인 관련된 정보들이 참 많습니다).

 

클릭하면 해시넷으로 넘어갑니다~

아까보단 훨씬 낫죠?

 

그래도 이해가 잘 안 될 수 있습니다. 

코드로 보시죠!

바로 감이 오시나요?

 

numbers 배열의 각 요소에 1을 더한 애들을 배열에 담아 보여 줍니다.

 

다른 예시를 한 번 들어볼까요?

 

아까 사용했던 numbers를 그대로 사용하는데, 이번에는 numbers 내부의 각 요소를 String 타입으로 활용해봤습니다.

 

 

이렇게 축약해서 쓸 수도 있습니다.

 

이번에는 한 번 스까서 써볼까요??

 

 

numbers의 각 요소에 3을 더한 뒤, 해당 내용을 다시 String 타입으로 변환하여 사용했습니다.

 

그러믄 이제 flatMap이랑 compactMap도 알아봅시다

 

(2) flatMap

이 설명에서 concatenated가 무슨 뜻일까요?

이 번역만 보고는 좀처럼 flatMap의 맛을 알 수가 없습니다. 코드로 봅시다!

읭? 이러면 flatMap이나 map이나 똑같은 거 아닌가요?

게다가 이제 flatMap은 deprecated 되었으니 compactMap을 쓰라고 하네요..?

 

compactMap은 뭘까요?

 

(3) compactMap

non-nil을 돌려준다는 내용이 보이네요!

 

아예 map, flatMap, compactMap을 한 번에 비교해 봅시다.

다 똑같네요? 이러면 차이를 알 수가 없겠지요? 이번에는 다른 예시를 활용해 봅시다.

 

차이가 보이시나요? mapNumbers의 배열들은 옵셔널 타입이고, nil도 그대로 출력이 되고 있습니다만,

flatMapNumbers와 compactMapNumbers는 nil은 알아서 거르고 옵셔널도 벗겨서 주고 있습니다.

 

그럼 flatMap이랑 compactMap은 완전히 같을까요?

이번에는 2차원 배열을 한 번 활용해 봅시다!

2차원 배열을 활용했을 때 map과 compactMap은 모두 2차원 배열 형태 그대로 출력을 했지만,

flatMap은 2차원 배열 내부의 요소들을 1차원으로 분해해서 돌려주네요!

flatMap이 ‘flatten’ 했다고 볼 수 있는 부분입니다.

이제 다시 flatMap의 설명을 보면 이해가 좀 더 잘 되지 않을까요?

 

map, flatMap, compactMap의 차이에 대해 어느 정도 감이 잡히셨나요?

처음에는 다소간에 낯설 수도 있지만 익숙해지시면 아주 편리한 도구가 될 것입니다!

졸코 하세요!