고차함수란?
고차 함수(higer order function)란 함수를 인자(aurgument)로 받을 수 있고, 함수의 형태로 리턴할 수 있는 함수를 말한다. 함수는 변수에 저장할 수 있고, 함수를 담은 변수를 인자로 전달 받을 수 있으며, 함수 내부에서도 변수에 함수를 할당할 수 있다. 그리고 함수는 이 변수를 리턴할 수 있다. 고차 함수는 변수가 빠졌을 뿐, 함수 자체를 리턴 하고 동일하게 동작한다. 이때 다른 함수(caller)의 인자로 전달되는 함수를 콜백 함수(callback funtion)라고 한다. 콜백 함수를 전달받은 고차함수는 함수 내에서 호출(invoke)할 수 있다.
커리 함수
'함수를 리턴하는 함수'로 이 방법을 고안해 낸 논리학자 하스켈 커리(Haskell curry)의 이름을 따 커리함수라고 한다. 여기서 정확하게 구분짓자면 고차함수가 커리함수를 포함한다.
다음의 예시가 있다.
function double(number) {
return number * 2;
}
function doubleNum(func, number) {
return func(number);
}
/*
-함수 doubleNum은 다른 함수를 인자로 받는 고차함수이다.
-함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우,
함수 func는 함수 doubleNum의 콜백함수이다.
-아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백함수이다.
*/
let output = dobuleNum(double, 4);
console.log(output); // -> 8
function adder(add) {
return function (number) {
return number + add;
};
}
/*
-함수 add는 다른 함수를 리턴하는 고차함수이다.
-add는 인자 하나를 입력받아 함수(익명)를 리턴한다.
-리턴되는 익명함수는 인자 하나를 받아서 add와 더한값을 리턴한다.
*/
//adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
let output = adder(5)(3); // -> 8
console.log(output); // -> 8
//adder가 리턴하는 함수를 변수에 저장할 수 있다.
// javasciprt에서 함수는 일급개체이기 때문이다.
const add3 = adder(3);
output = add3(2);
console.log(output); // -> 5
function double(number) {
return number * 2;
}
function doubleAdder(add, func) {
const doubled = func(add);
return function (number) {
return number + doubled;
};
}
/*
-함수 doubleAdder는 고차함수이다.
-함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백함수이다.
-함수 double은 함수 doubleAdder의 콜백으로 전달됐다.
*/
doubleAdder(5, double)(3); // -> 13
//doubleAdder가 리턴하는 함수를 변수에 저장할 수 있다.
const addTwice3 = doubleAdder(3, double);
addTwice(2); // -> 8