# 고차함수가 무엇인지 설명하고, Swift의 map, filter, reduce, compactMap, flatMap에 대하여 설명하시오. ### 고차함수란 무엇일까요? - 하나 이상의 `함수(클로저)를 인자`로 받거나, `함수(클로저)를 반환`하는 함수를 의미합니다. swift의 함수(클로저)는 일급시민이기 때문에, 함수의 전달인자로 전달하거나, 결과값으로 반환할 수 있습니다. 참고로 클로저는 `named, unnamed 두 종류`가 있고, `함수가 named 클로저`입니다. ### 일급시민이란 무엇인가요? - 변수에 저장이 가능하고, 매개변수로 전달이 가능하며, 반환값으로 사용이 가능하다는 조건을 모두 만족하는 것을 일급시민이라고 합니다. ### 고차함수에는 어떤 것들이 있나요? - map, filter, reduce, flatMap, compactMap이 있습니다. ### map, filter, reduce, flatMap, compactMap에 대해서 설명해주세요. - map 함수는 컨테이너 내부의 `기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성` - filter 함수는 컨테이너 내부의 `값을 걸러서 새로운 컨테이너로 추출`, 요소가 반환된 배열에 포함되어야 하는지 여부를 `Bool 값으로 반환`하는 클로저입니다. - reduce 함수는 컨테이너 내부의 콘텐츠를 `하나로 통합` - flatMap 함수는 map과 동일하지만, `차원을 한단계 낮춘 새로운 컨테이너`를 생성 - compactMap 함수는 map과 동일하지만, 결과값에서 `nil을 제거하고 옵셔널 바인딩을 적용시킨 새로운 컨테이너`를 생성 ### 고차함수 중 flatMap과 compactMap의 차이를 설명해보세요. - compactMap은 1차원 배열에서 각 요소에 대해 `nil을 제거하고 옵셔널 바인딩을 한 결과를 배열`로 만들어 반환 - flatMap은 배열의 요소 타입이 옵셔널이라면, n`il을 제거하고 옵셔널 바인딩을 한 결과를 배열`로 만들어 반환 - flatMap은 2차원 배열이면서 요소 타입이 옵셔널이 아니라면, `배열의 요소들을 1차원으로 합친 배열을 반환`하고 `nil의 제거와 옵셔널 바인딩`은 하지 않음 ### 고차함수를 사용하는 이유는 무엇인가요? - 반복문을 사용하여 구현을 할 수 있지만, 새로 컨테이너에 담아서 계속 append를 시켜주기 때문에 `변수를 사용`해야 합니다. 하지만 고차함수를 사용하면 `상수를 사용`하면 되어서 `메모리 자원측에서 더 효율적`으로 사용할 수 있습니다. 또한 반복문으로 구현하게 되면 가독성이 떨어지고 복잡해지기 때문에, 가독성을 올리고 편리성을 높이기 위해서 사용합니다. ## 출처 [compactMap, flatMap](https://velog.io/@un1945/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-compactMap-flatMap) [map, reduce, filter](https://velog.io/@un1945/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-Higher-order-Function) [고차함수](https://velog.io/@aurora_97/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98) [Map](https://developer.apple.com/documentation/swift/array/map(_:)-87c4d) [Filter](https://developer.apple.com/documentation/swift/sequence/filter(_:)) [Reduce](https://developer.apple.com/documentation/swift/array/reduce(_:_:))