고차 함수는 다른 함수를 전달인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수 를 뜻한다.
스위프트의 함수(클로저)는 일급시민(일급객체)이기 때문에 함수의 전달인자로 전달할 수 있고
함수의 결과 값으로 반환할 수 있다.
JS에서 제공하는 map, filter, reduce 고차 함수가 있고 컨테이너 타입(Array, Set, Dictionary 등) 에 구현되어 있다.
map은 데이터를 변형하고자 할 때 사용합니다.
기존 데이터를 변형하여 새로운 컨테이너를 만드는데, 기존 데이터는 변형되지 않습니다.
- 코드의 간결성
- 재사용 용이
- 컴파일러 최적화 성능 좋음
모든 요소 각각에 동일한 함수(callback 함수)를 적용한 값들을 모아 새로운 배열을 반환한다. filter와 마찬가지로 기존 배열을 수정하지 않고, 새로운 배열로 반환해준다.
arr.map(callback함수)
차이점은 눈으로 봤을 때 가장 빨리 보이기 때문에 다음 예제를 살펴보겠습니다.
let arr = [1, 2, 3];
let result =
arr.map(function(ele) {
return ele * 2;
});
result; //[2, 4, 6]
Filter(추출)
filter는 데이터를 추출하고자 할 때 사용합니다.
기존 컨테이너에서 내부의 값을 걸러 새로운 컨테이너를 만듭니다.
filter 의 매개변수로 전달되는 함수의 반환 타입은 Bool 이다.
true 면 값을 포함하고, false 면 값을 배재한다.
map 과 마찬가지로 새로운 컨테이너를 생성하여 값을 반환한다.
arr.filter(callback함수)
let arr = [12, 5, 8, 130, 44];
function isBigEnough(value) {
return value >= 10;
}
let filtered = arr.filter(isBigEnough); //[12, 130, 44]
Reduce(결합)
reduce는 데이터를 합쳐주기 위해 사용합니다.
배열의 각 요소에 대해 reducer 함수(callback 함수)를 실행하고, 하나의 결과값을 return한다. 다시말해 여러개의 데이터들이 속한 배열을 하나의 데이터로 응축(reduce)하는 것이다.
기존 컨테이너에서 내부의 값들을 결합하여 새로운 값을 만듭니다.
arr.reduce(callback함수, 초기값)
여기서 reducer 함수는 네 개의 인자를 갖게된다. (모두 필수는 아닙니다.)
1) 누산기 (accumulator)
2) 현재 값 (currentValue)
3) 현재 인덱스 (currentIndex)
4) 원본 배열 (array)
reducer함수에서 최종적으로 반환되는 값은 누산기(accumulator)에 계속해서 누적, 갱신된 하나의 값이라고 생각하면 된다.
아래 코드를 보면, accumulator(누산기)와 currentValue(현재값)이 reducer함수의 인자로 들어간다. 즉 현재값이 계속해서 누산기에 더해지는 코드이기 때문에, 차례대로 현재값이 되는 1, 2, 3, 4가 누산기에 계속 더해져 모두 합한값인 10이 최종적으로 return 되는 것이다.
let arr = [1, 2, 3, 4];
let sum = arr.reduce(function (acc, curr) {
return acc + curr;
}); // sum = 10
여기에 초기값을 10으로 설정해주면, 누산기의 초기값이 10이 되고, 거기에 1, 2, 3, 4가 누적되면서 더해져 최종적으로는 20이라는 값을 얻게 된다.
let arr = [1, 2, 3, 4];
let sum = arr.reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 10);
// sum = 20