[IOS / Swift] 고차함수 (map, filter, reduce)

서프로·2023년 4월 5일
0
post-thumbnail

고차함수란?

고차함수란, 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말함.
Swift에서 제공하는 대표적인 고차함수로 map, filter, reduce가 있음

map

컨테이너 내부의 각각의 요소에 대해 동일한 작업을 수행하여 새로운 컨테이너를 반환함
이 때, 원래 컨테이너는 변경되지 않음

예를 들어, 다음과 같은 Int 타입의 배열이 있다고 가정하고, 이 배열의 모든 요소를 2배로 만들어 새로운 배열을 만들고 싶다면 아래와 같이 map을 사용할 수 있음.

let numbers = [1, 2, 3, 4, 5]

let doubledNumbers = numbers.map { $0 * 2 }
print(doubledNumbers) // [2, 4, 6, 8, 10]

위 코드에서는 map 함수를 호출하면서 클로저를 전달했음. 클로저 내부에서는 numbers 배열의 각 요소를 $0으로 받아와서, 해당 요소를 2배로 만들어 반환하고 있음. 이렇게 반환된 값들은 doubledNumbers 배열에 저장되어 반환됨.

map 함수는 배열 뿐만 아니라, 딕셔너리, 셋 등의 다양한 컨테이너에서 사용할 수 있는데, 아래는 딕셔너리에서 map을 사용한 예시임.

let people = ["Alice": 27, "Bob": 21, "Charlie": 30]
let ageInMonths = people.map { $0.value * 12 }
print(ageInMonths) // [324, 252, 360]

위 코드에서는 people 딕셔너리에서 값에 해당하는 나이를 월 단위로 계산하여 새로운 배열인 ageInMonths 배열을 만들고 있음.

filter

컨테이너 내부의 요소 중 특정 조건을 만족하는 요소만을 선택하여 새로운 컨테이너를 반환합니다. 이 때, 원래 컨테이너는 변경되지 않음.

아래와 같이 Int 타입의 배열이 있다고 가정하고, 배열에서 짝수인 요소를 뽑아 새로운 배열을 만들고 싶다면 다음과 같이 filter를 사용할 수 있음.

let numbers = [1, 2, 3, 4, 5]

let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4]

위 코드에서는 filter 함수를 호출하면서 클로저를 전달.
클로저 내부에서는 numbers 배열의 각 요소를 $0으로 받아와서, 해당 요소가 2로 나누어 떨어지는지를 검사한 후, true나 false를 반환하고 있습니다. 반환된 값이 true인 요소만 evenNumbers 배열에 저장되어 반환됨.

filter 함수도 map 함수와 마찬가지로 배열 뿐만 아니라, 딕셔너리, 셋 등의 다양한 컨테이너에서 사용할 수 있음. 다음은 딕셔너리에서 filter를 사용하는 예시임.

let people = ["Alice": 27, "Bob": 21, "Charlie": 30]
let adults = people.filter { $0.value > 21 }
print(adults) // ["Alice": 27, "Charlie": 30]

reduce

컨테이너 내부의 요소들을 결합하여 하나의 값으로 만듭니다. 이 때, 결합하는 방법은 클로저를 이용하여 지정할 수 있음.

아래와 같이 Int 타입의 배열이 있다고 가정하고, 이 배열의 모든 요소의 총합을 구하고 싶다면, 다음과 같이 reduce를 사욜할 수 있음.

let numbers = [1, 2, 3, 4, 5]

var sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15

sum = numbers.reduce(0, +)
print(sum) // 15

위 코드에서는 reduce 함수를 호출하면서 초깃값인 0을 전달.
클로저 내부에서는 이전까지 누적된 값을 $0으로, 현재 요소를 $1로 받아와서, 누적된 값과 현재 요소를 더한 값을 반환하고 있음. 이렇게 반환된 값이 다시 누적되어 최종적으로 sum 변수에 저장됨.

reduce 함수도 마찬가지로 배열 뿐만 아니라, 딕셔너리, 셋 등의 다양한 컨테이너에서 사용할 수 있는데 아래는 딕셔너리에서 사용한 예시임.

let scores = ["Alice": 85, "Bob": 73, "Charlie": 92]

let totalScore = scores.reduce(0) { $0 + $1.value }
print(totalScore) // 250

위 코드에서는 scores 딕셔너리에서 값에 해당하는 점수를 모두 더하여, totalScore 변수에 저장하고 있음.

이상으로 고차함수에 대해서 알아보았음.

0개의 댓글