함수들을 입력받아 입력받은 함수들을 연달아 결합하는 함수 '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;
}
}
이처럼 고차함수를 활용하면 기존에 값을 전달받아 값만을 전달하는 함수보다 훨씬 복잡한 과정을 수행할 수 있게 된다.
함수에 하나의 기능을 수행하기 위한 사고 과정의 흐름이 담겨 있다고 생각하면,
고차함수는 사고의 흐름을 하나로 응축해 다른 사고 과정에 주입하는 것을 가능하게 해 준다.
고차함수를 통해 더 높은 수준의 추상화에 도달할 수 있는 것이다.
'Javascript' 카테고리의 다른 글
[Javascript] 프로토타입 체인 (0) | 2023.03.16 |
---|---|
[Javascript] 클래스와 객체지향 프로그래밍 (0) | 2023.03.15 |
[Javascript] DOM (0) | 2023.03.07 |
[Javascript] 구조 분해 할당 (0) | 2023.03.06 |
[Javascript] 스코프와 클로저 (0) | 2023.03.03 |