https://ko.javascript.info/currying-partials
커링
ko.javascript.info
Currying이란?
Currying(커링)은 함수를 한 번에 여러 개의 인자를 받는 대신, 하나의 인자만 받아서 새로운 함수를 반환하도록 변환하는 기법입니다. 다시 말해, n개의 인자를 받는 함수를 n개의 단일 인자를 받는 함수로 분리하는 것입니다.
쉽게 설명하자면?
커링은 "한 번에 모든 일을 하지 말고, 한 단계씩 나누어 처리하자"는 개념과 비슷합니다. 예를 들어, 두 명이 짐을 옮기는 상황을 생각해 봅시다. 한 사람이 짐을 전부 한 번에 들고 가는 대신, 각자 나누어 들어서 목적지로 옮기는 것이 더 효율적일 수 있습니다. 이처럼, 함수를 한 번에 호출하는 대신 단계별로 호출할 수 있도록 바꾸는 것이 커링입니다.
커링은 주로 함수형 프로그래밍에서 사용됩니다. 대표적인 언어로는 JavaScript, Haskell 등이 있지만, Python에서도 구현 가능합니다.
JavaScript 예제
function multiply(a) {
return function (b) {
return a * b;
};
}
// 사용 방법
const multiplyBy2 = multiply(2); // a에 2 고정
console.log(multiplyBy2(5)); // b에 5를 넣어 계산 (결과: 10)
커링 장점
- 재사용성 증가: 커링된 함수는 특정 인자를 고정하여 쉽게 재사용할 수 있습니다.
- 예: multiply_by_2처럼 특정 값을 고정한 함수 생성.
- 코드 가독성 향상: 단계별로 나눠서 계산 과정을 명확히 할 수 있습니다.
- 부분 적용 함수(PF: Partial Function)를 생성하는 데 유용함.
_.curry란?
_.curry는 JavaScript의 Lodash 라이브러리에서 제공하는 유틸리티 함수로, 기존의 함수를 커링(Currying) 가능한 형태로 변환합니다. 이 함수는 주어진 함수에 필요한 모든 인자가 전달될 때까지 부분적으로 함수를 실행하도록 만들어 줍니다.
_.curry(func)
- func: 커링 가능한 형태로 변환할 함수입니다.
- 반환값: 커링된 함수
사용법
const _ = require('lodash');
// 기존 함수
function add(a, b) {
return a + b;
}
// 커링된 함수
const curriedAdd = _.curry(add);
// 사용
console.log(curriedAdd(1)(2)); // 3
console.log(curriedAdd(1, 2)); // 3
- curriedAdd(1)(2): 첫 번째 호출에서 a를 받고, 두 번째 호출에서 b를 받아 최종 결과를 반환합니다.
- curriedAdd(1, 2): 모든 인자를 한 번에 전달하면 즉시 결과를 반환합니다.
_.curry의 특징
const curriedMultiply = _.curry((a, b, c) => a * b * c);
const multiplyBy2 = curriedMultiply(2);
console.log(multiplyBy2(3)(4)); // 24
- 부분 적용 지원
필요한 인자의 일부만 전달해도 작동하며, 모든 인자가 전달될 때까지 기다립니다. - 유연성
- 한 번에 모든 인자를 전달하거나 단계별로 나눠서 전달 가능.
- 커링된 함수는 필요에 따라 자유롭게 호출 가능.
- 코드 가독성 향상
복잡한 계산을 나눠서 처리할 수 있어 코드가 명확해집니다.
주의점
- 너무 많은 단계 호출
너무 깊게 커링된 함수는 오히려 가독성을 떨어뜨릴 수 있습니다. - 필요 이상의 복잡성
단순히 호출하면 되는 함수를 커링으로 복잡하게 만드는 것은 피해야 합니다.
추가 설명
'개발일지 > JavaScript' 카테고리의 다른 글
[34] OOP(Object-oriented programming) (0) | 2024.11.28 |
---|---|
[33] strict mode (0) | 2024.11.27 |
[31] 순수 함수 (Pure Function) (0) | 2024.11.27 |
[30] Intersection observer (0) | 2024.11.27 |
[29] IIFE(Immediately Invoked Function Expression) (0) | 2024.11.27 |