#9 TIL 다시정리하는 고차함수🧐

장석진·2021년 4월 1일
0

전에 고차함수를 정리하여 적었는데 그 거의 일기처럼 적어서 이번에 다시 정리를 한번 해보자!!

✏️ 함수에 대해서

먼저 자바스크립트에서는 비행기 좌석에 "퍼스트 클래스" 처럼 특별한 대우를 받는 것이 있는데 그런 대우를 받는 것들을 일급객체라고 한다. 그중에서도 우리가 배웠던 함수도 그 중에 하나다. 함수는 밑에와 같은 조건들을 가진다.

  • 첫번째로는 변수에 할당 할 수 있다.
  • 두번째로는 다른 함수의 인자로 전달될 수 있다.
  • 세번째로는 다른함수의 결과로서 리턴될 수 있다.
  • 자바스크립트에서는 함수의 표현식과 함수 선언식이 있는 데 우리가 자주 사용하고 배웠던건 함수 선언식이다. 밑에 표현된 식은 "변수에 함수를 할당하는 경우"을 코드로 작성을 한 것이다.

    // 아래는 변수 square에 함수를 할당하는 함수 표현식입니다.
    // 자바스크립트에서 함수는 일급 객체이기 때문에 변수에 저장할 수 있습니다.
    
    // 함수 표현식은 할당 전에 사용할 수 없습니다.
    // square(7); // --> ReferenceError: Can't find variable: square
    
    const square = function (num) {
      return num * num;
    };
    
    // square에는 함수가 저장되어 있으므로 (일급 객체), 함수 호출 연산자 '()'를 사용할 수 있습니다.
    output = square(7);
    console.log(output); // --> 49

    고참함수란?🔍

    고차함수는 함수를 인자로 받거나 함수를 리턴하는 함수를 말한다. 이 때 다른 함수의 인자로 전달되는 함수를 콜백함수라고 말한다. 콜백 함수를 전달받은 함수는 이 콜백 함수를 호출(invoke)할 수 있다.

    콜백 함수를 전달받은 함수는 이 콜백 함수를 호출 할 수 있다. 다른 함수는 조건에 따라 콜백 함수의 실행 여부를 결정할 수도 있으며 심지어 여러 번 실행도 가능하다. 특히 콜백 함수는 어떤 작업이 완료되었을 때 호출되는 경우가 많아서 답신 전화를 뜻하는 "콜백"이라는 이름이 붙여졌다.

    한편으로 "함수를 리턴하는 함수"만을 일컫는 용어가 따로 존재하고 실제로도 많이 사용을 한다고 한다. 이런 함수를 만든 논리학자 하스켈 커리의 이름을 따라서 "커리 함수"라고 한다고 한다. 따로 커리 함수라는 용어를 사용하는 경우, 고차 함수란 용어를 '함수를 인자로 받는 함수'에만 한정지어서 사용한다. 하지만 엄밀한 의미에서 고차 함수는 커리 함수를 포함한다.

    고차함수의 작성예시💻

    1. 다른 함수를 인자로 받는 경우

    function double(num) {
      return num * 2;
    }
    
    function doubleNum(func, num) {
      return func(num);
    }
    
    // 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수입니다.
    // 함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우
    // 함수 func는 함수 doubleNum의 콜백 함수입니다.
    // 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수입니다.
    let output = doubleNum(double, 4);
    console.log(output); // -> 8

    2. 함수를 리턴하는 경우

    function adder(added) {
      return function (num) {
        return num + added;
      };
    }
    
    // 함수 adder는 다른 함수를 리턴하는 고차 함수입니다.
    // adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴합니다.
    // 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴합니다.
    
    // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있습니다.
    let output = adder(5)(3); // -> 8
    console.log(output); // -> 8
    
    // adder가 리턴하는 함수를 변수에 저장할 수 있습니다.
    // javascript에서 함수는 일급 객체이기 때문입니다.
    const add3 = adder(3);
    output = add3(2);
    console.log(output); // -> 5

    3.함수를 인자로 받고, 함수를 리턴하는 경우

    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

    고차함수는 자바스크립트에서 자주 사용하는 함수이기에 더 복습하고 코플릿을 풀면서 개념을 익히는 습관을 길러야겠다✌️

    profile
    개발자가 되고 싶은 새내기

    0개의 댓글