고차함수란?
고차함수란, 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말함.
Swift에서 제공하는 대표적인 고차함수로 map, filter, reduce가 있음
컨테이너 내부의 각각의 요소에 대해 동일한 작업을 수행하여 새로운 컨테이너를 반환함
이 때, 원래 컨테이너는 변경되지 않음
예를 들어, 다음과 같은 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 배열을 만들고 있음.
컨테이너 내부의 요소 중 특정 조건을 만족하는 요소만을 선택하여 새로운 컨테이너를 반환합니다. 이 때, 원래 컨테이너는 변경되지 않음.
아래와 같이 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]
컨테이너 내부의 요소들을 결합하여 하나의 값으로 만듭니다. 이 때, 결합하는 방법은 클로저를 이용하여 지정할 수 있음.
아래와 같이 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 변수에 저장하고 있음.
이상으로 고차함수에 대해서 알아보았음.