고차함수

최경락 (K_ROCK_)·2021년 12월 2일
0

1급시민

  • 1급시민이란, 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 값을 뜻한다.
  • 아래와 같은 조건을 모두 가질 때 일급시민이라고 부른다.
    1. 다른 변수에 할당 될 수 있다.
    2. 함수의 매개변수로 사용이 가능하다.
    3. 함수의 결과로 리턴 될 수 있다.
  • 객체가 위의 조건을 만족하는 경우, 1급객체라고 하며, 함수는 위의 조건을 만족하는 1급객체와 동시에 1급함수이다.
  • 1급함수가 아니고 1급객체라고 표현함?
    1. JS 상에서 함수는 객체로 취급된다.
    2. 심지어 프로퍼티를 추가하여 값을 가질 수도 있다.

고차함수란?

  • 함수를 인자로 받을 수 있으며, 함수의 형태로 리턴 할 수 있는 함수를 고차함수라고 한다.
  • 이때, 인자로 전달되는 함수콜백(callback)함수라고 한다.
    콜백함수를 인자로 가지고 있는 함수콜러(caller)라고 한다.
  • 이때, 콜백함수를 가지는 구조의 함수를 커리함수라고 한다.
    → 정확히는 고차함수라는 큰 카테고리에 커리함수가 포함된다.
  • 함수가 1급객체이기 때문에 고차함수라는 것이 존재 할 수 있다.
    → 변수에 할당 될 수 있고, 인자로 사용 될 수 있고, 함수의 리턴 값이 될 수도 있다.

커링이라는 단어는 다수의 인자를 받는 함수를 단일 인자를 받는 함수의 체인으로 만드는 것을 뜻한다.
→ 즉, 콜백을 받는 함수이다.
→아래의 예시에서 함수를 리턴하는 형태 참고.

고차함수의 형태

  • 함수를 인자로 받는 형태
let argFn = (num) => {
  return num * 2
}

let mainFn = (func, num) => {
  return func(num)
}

mainFn(argFn, 5) // 10

// mainFn이 인자로 argFn을 받고, 
// num으로 받은 인자인 5를
// 함수의 내부에서 argFn 의 인자로 사용하여,
// 그 결과를 리턴한다.
  • 함수를 리턴하는 형태
let outerFn = (outerParam) => {
  return function (innerParam){
    return outerParam + innerParam
  }
}

outerFn(15)(5) // 20

// 각각 외부함수와 내부함수의 인자로 사용된다.

let outer10 = outerFn(10)
outer10(5) // 15 === outerFn(10)(5)

// outerFn() 자체가 함수이므로, 
// 해당 함수에 인자를 입력한 값을 outer10 이라는 변수에 지정할 수 있다.
// 일종의 함수표현과 유사하다고 볼 수 있으며,
// 당연히 outer10도 함수이니 인자를 입력하여 실행 할 수 있다.
  • 함수를 인자로 받고, 함수로 리턴하는 형태
const plus10 = (num) => {
  return num + 10;
}

const addFunc = (outerNum, func) => {
  const plused10 = func(outerNum);
  return function (innerNum) {
    return innerNum + plused10;
  };
}

addFunc(10, plus10)(10) // 30

// 각각 외부함수와 내부함수의 인자로 사용된다.

// addFunc는 숫자 10(outerNum)과 plus10 이라는 함수를 외부함수의 인자로 받는다.
// 10은 함수내부에서 다시 plus10(func)의 인자로 사용되고,
// 이 값을 plused10 에 할당한다.

// addFunc 는 내부함수의 인자로 10을 받고,
// 이를 내부함수의 매개변수인 innerNum에 전달한다.
// 내부함수는 10(innerNum)과 20(plused10)의 값을 더해 30을 반환한다.

let plused15 = addFunc(5, plus10)
plused15(10) // 25 === addFunc(5, plus10)(10)

// 함수를 리턴하는 형태와 같이, 함수인 addFunc의 값을 변수로 지정하고,
// 그 변수에 인자를 넣어 실행하면 위와 같이 실행 할 수 있다.

+

  • 함수 표현식은 호이스팅이 적용되지 않는다.
    → 함수 선언만 호이스팅이 적용됨.
  • 호이스팅에 의존하면 유지보수가 힘들어진다.
    → 작성된 함수를 사용하기 위해 자꾸 위아래로 왔다가 갔다가 해야함.
  • 어떤 함수인지 감은 오지만 내가 잘 써먹을 수 있을지는 미지수...

0개의 댓글