부분 어플리케이션, 커링, 함수 합성과 파이프
Chapter 32 - Partial Applications, Currying, Compose and Pipe
부분 어플리케이션
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)과 같은 기법과 결합하여 사용할 수 있다.
함수 합성
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)
라고 표현하여 이 형태를 유지하는데 의미가 있다.
파이프의 경우 반대로 좌 → 우로 작성되기 때문에 읽는 순서대로 실행이 가능하여 더 직관적이므로 가독성을 더 높일 수 있다는 장점이있다.
초판: 2024. 08. 20. 22:46:50
© 2024 이 문서는 "CC BY 4.0 국제규약" 라이선스로 배포 되었습니다. 모든 권리는 저자에게 있습니다.