학습목표 정리

[JS/Node] 고차함수 Chapter - 고차함수 이해하기

he2mo 2021. 9. 13. 17:51

 

Achievement Goals

 

  • 일급 객체(first-class citizen)의 세 가지 특징을 설명할 수 있다.

 

다음과 같은 조건을 만족하는 객체를 일급 객체라고 한다.

 

  1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
  2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  3. 함수의 매개변수에 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.

 

함수는 자바스크립트에서 대표적인 일급 객체 중 하나이다.

 

// 1. 함수는 무명의 리터럴로 생성할 수 있다.
// 2. 함수는 변수에 저장할 수 있다.
// 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다.

const increase = function (num) {
    return ++num;
};

const decrease = function (num) {
    return --num;
};

// 2. 함수는 객체에 저장할 수 있다.
const predicates = { increase, decrease };

// 3. 함수의 매개변수에 전달할 수 있다.
// 4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(predicate) {
    let num = 0;
    
    return function () {
        num = predicate(num);
        return num;
    };
}

// 3. 함수는 매개변수에게 함수를 전달할 수 있다.
const increaser = makeCounter(predicates.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2

// 3. 함수는 매개변수에게 함수를 전달할 수 있다.
const decreaser = makeCounter(predicates.decrease);
console.log(decreaser()); // -1
console.log(decreaser()); // -2

// 참고자료 모던 자바스크립트 Deep Dive

 

  • 고차 함수(higher-order function)에 대해 설명할 수 있다.

 

고차 함수는 함수를 인자로 받을 수 있고 함수의 형태로 리턴할 수 있는 함수이다. 일상생활에서 얘기하는 1,2,3,4차원처럼 고차 함수는 함수 안에 함수... 함수 안에 함수... 같은 식으로 이해할 수 있다.

 

다른 함수의 인자로 전달되는 함수를 콜백 함수라고 부르며 콜백 함수를 전달받은 고차 함수는 함수 내부에서 이 콜백 함수를 호출할 수 있다.

 

함수를 리턴하는 함수는 처음으로 고안해 낸 논리학자 하스켈 커리(Haskell Curry)의 이름을 따서 커리 함수라고 부르기도 한다.

 

function double(num) {
    return num * 2;
};

function doubleAdder(added, func) {
    const doubled = func(added);
    return function (num) {
        return num + doubled;
    };
};

// 함수 doubleAdder는 고차 함수이다.
// 함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수이다.
// 함수 double은 함수 doubleAdder의 콜백으로 전달되었다.

// doubleAdder(5, double)은 함수이므로 함수 호출 기호 '()'를 사용할 수 있다.
doubleAdder(5, double)(3); // 13


// doubleAdder가 리턴하는 함수를 변수에 저장할 수 있다. (일급 객체)
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // 8