logo

부분 어플리케이션, 커링, 함수 합성과 파이프

Chapter 32

77 조회

0 추천

591 단어

3분 예상

2024. 08. 20. 게시

2025. 02. 23. 수정

luasenvy 작성

CC BY-NC-SA 4.0

부분 어플리케이션

const multiply = (x, y) => x * y;
const double = multiply.bind(null, 2);
console.log(double(5)); // 10

함수의 일부 인자를 미리 제공하여 새로운 함수를 만드는 기법이다. 코드의 반복성을 줄여 가독성과 유지보수를 더 쉽게 할 수 있다. bind() 함수는 this, call, apply 그리고 bind 여기서 봤던 그 함수가 맞다.

커링

const add = (x) => (y) => x + y
const add5 = add(5);
console.log(add5(10)); // 15

커링은 여러 개의 인자를 받는 함수 하나를 여러 단계로 분리하여 단계별로 처리할 수 있도록 변환하는 기법이다. 각 단계마다 하나의 인자를 받고 마지막 단계에서 최종 값을 반환하도록 구성하여 코드의 재사용성을 높이고 함수 합성Composition과 같은 기법과 결합하여 사용할 수 있다.

함수 합성 ( Function Composition )

const compose = (a, b) => (x) => a(b(x));

const add3 = (x) => x + 3;
const multiply4 = (x) => x * 4;

const add3Multiply4 = compose(multiply4, add3);

console.log(add3Multiply4(5)); // (5 + 3) * 4 = 32

여러 개의 작은 함수를 결합하여 더 복잡한 함수를 구성하는 기법이다. 합성된 함수는 앞의 함수의 출력을 다음 함수의 입력으로 사용해 복잡한 연산을 하나의 흐름으로 처리할 수 있다. 마찬가지로 코드를 더 간결하게 만들 수 있고 그에 따라 유지보수가 편리한 코드를 작성할 수 있다.

파이프

const pipe = (...functions) => (params) => functions.reduce((acc, fn) => fn(acc), params)

const add3 = (x) => x + 3;
const multiply4 = (x) => x * 4;
const double = (x) => x * 2;

console.log(double(multiply4(add3(2))));   

pipe(add3, multiply4, double)(2);

파이핑과 함수 합성의 근본적인 작동원리는 동일하지만 각각 우->좌, 좌->우 의 순서에서 차이점이 있다. 함수 합성의 경우 수학적 전통에 의해서 a(b(x)) 라는 형식을 유지한다. 코드에서도 영향을 받아 compose(a, b)(x)라고 표현하여 이 형태를 유지하는데 의미가 있다.

파이프의 경우 반대로 좌 -> 우로 작성되기 때문에 읽는 순서대로 실행이 가능하여 더 직관적이므로 가독성을 더 높일 수 있다는 장점이있다.