Javascript

[Javascript] 고차함수

JeanneLee57 2023. 3. 14. 23:36

 

함수들을 입력받아 입력받은 함수들을 연달아 결합하는 함수 'pipe'를 만들어 보자.

//출력 예시

function square(num) {
  return num * num;
}

function add5(num) {
  return num + 5;
}

function mul3(num) {
  return num * 3;
}

function isOdd(num) {
  return num % 2 !== 0;
}

let output = pipe(add5, square);
console.log(output(4)); // --> 81

output = pipe(square, add5, mul3);
console.log(output(4)); // --> 63

output = pipe(square, mul3, add5, add5, isOdd);
console.log(output(4)); // --> false

 

함수를 실행했는데 다른 함수를 리턴하는 것이 어떻게 가능할까?

이것이 바로 고차함수의 개념이다.

고차함수는 함수가 가지는 일급 객체로서의 성격 때문에 가능해진다.

 

일급 객체는

• 변수에 할당할 수 있고,

• 다른 함수의 전달인자로 전달될 수 있으며, 

• 다른 함수의 결과로 리턴될 수 있다.

 

함수는 대표적인 일급 객체다.

위와 같은 성격 때문에 고차함수, 즉 함수의 전달인자로 전달되거나 함수를 리턴하는 함수가 존재할 수 있다.

 

위 예시에서 pipe 함수는 다른 함수 여러 개를 전달인자로 받아 그 함수들을 결합해 리턴한다.

즉, pipe(add5, square)(4) 는 add5(sqare(4))와 같은 결과가 나와야 한다.

함수를 작성한 결과는 다음과 같다.

//몇 개의 전달인자가 들어올지 알 수 없으므로 ...rest 파라미터를 사용한다.
//rest는 전달인자들을 배열로 받는다.
function pipe(...rest) {
//pipe함수는 새로운 함수를 리턴한다.
//리턴될 함수는 나중에 전달될 전달인자를 받을 수 있도록 파라미터를 둔다(num).
  return function(num){
//result라는 변수를 선언해 나중에 내부함수에서 리턴할 준비를 한다.
//이 result는 뒤에 나올 for문에서 배열을 순회함에 따라서 값이 계속 바뀐다.
    let result = num;
//rest 배열을 순회하는 for ... of문을 작성한다.
    for(let x of rest){
//배열에 나열돼 있는 각 함수의 결과값이 차례로 result에 할당된다.
      result = x(result)
    }
//result를 리턴
    return result;
    }
}

 

이처럼 고차함수를 활용하면 기존에 값을 전달받아 값만을 전달하는 함수보다 훨씬 복잡한 과정을 수행할 수 있게 된다.

함수에 하나의 기능을 수행하기 위한 사고 과정의 흐름이 담겨 있다고 생각하면,

고차함수는 사고의 흐름을 하나로 응축해 다른 사고 과정에 주입하는 것을 가능하게 해 준다.

고차함수를 통해 더 높은 수준의 추상화에 도달할 수 있는 것이다.