🛠️ 처음부터 만드는 Curry — 함수를 부분 적용하기
# 🛠️ 처음부터 만드는 Curry — 함수를 부분 적용하기
Curry는 여러 개의 인자를 받는 함수를 한 번에 하나씩 인자를 받는 함수들의 체인으로 변환합니다. 함수형 프로그래밍의 핵심 기법입니다.
```javascript
const add = (a, b, c) => a + b + c;
// 일반 호출
add(1, 2, 3); // 6
// Curry 적용 후
const curriedAdd = curry(add);
const add1 = curriedAdd(1); // (b, c) 함수 반환
const add1_2 = add1(2); // (c) 함수 반환
const result = add1_2(3); // 6 (최종 결과)
// 또는 한 번에
curriedAdd(1)(2)(3); // 6
```
```javascript
function curry(fn) {
const arity = fn.length; // 함수가 받는 인자 개수
return function curried(...args) {
// 받은 인자가 필요한 개수와 같거나 크면 실행
if (args.length >= arity) {
return fn(...args);
}
// 아직 부족하면 나머지 인자를 기다리는 함수 반환
return (...nextArgs) => curried(...args, ...nextArgs);
};
}
```
```javascript
// API 요청 헬퍼
const fetchAPI = curry((method, url, data) =>
fetch(url, { method, body: JSON.stringify(data) })
);
const postRequest = fetchAPI('POST');
const postToUsers = postRequest('/api/users');
postToUsers({ name: 'John' });
// 데이터 변환
const multiply = curry((a, b) => a * b);
const double = multiply(2);
const triple = multiply(3);
[1, 2, 3].map(double); // [2, 4, 6]
[1, 2, 3].map(triple); // [3, 6, 9]
// 설정 팩토리
const createLogger = curry((prefix, level, message) =>
console.log(`[${prefix}:${level}] ${message}`)
);
const appLogger = createLogger('APP');
const errorLog = appLogger('ERROR');
errorLog('Something went wrong'); // [APP:ERROR] Something went wrong
```
1. 재사용성: 부분 적용으로 특화된 함수 만들기
2. 가독성: 함수 조합이 명확해짐
3. 테스트: 작은 함수들로 분리되어 단위 테스트 용이
[JavaScript.info - Currying](https://javascript.info/currying)
[Lodash curry 문서](https://lodash.com/docs/#curry)
[함수형 프로그래밍 가이드](https://eloquentjavascript.net/05_higher_order.html)
Curry는 여러 개의 인자를 받는 함수를 한 번에 하나씩 인자를 받는 함수들의 체인으로 변환합니다. 함수형 프로그래밍의 핵심 기법입니다.
기본 개념
```javascript
const add = (a, b, c) => a + b + c;
// 일반 호출
add(1, 2, 3); // 6
// Curry 적용 후
const curriedAdd = curry(add);
const add1 = curriedAdd(1); // (b, c) 함수 반환
const add1_2 = add1(2); // (c) 함수 반환
const result = add1_2(3); // 6 (최종 결과)
// 또는 한 번에
curriedAdd(1)(2)(3); // 6
```
구현
```javascript
function curry(fn) {
const arity = fn.length; // 함수가 받는 인자 개수
return function curried(...args) {
// 받은 인자가 필요한 개수와 같거나 크면 실행
if (args.length >= arity) {
return fn(...args);
}
// 아직 부족하면 나머지 인자를 기다리는 함수 반환
return (...nextArgs) => curried(...args, ...nextArgs);
};
}
```
실전 예제
```javascript
// API 요청 헬퍼
const fetchAPI = curry((method, url, data) =>
fetch(url, { method, body: JSON.stringify(data) })
);
const postRequest = fetchAPI('POST');
const postToUsers = postRequest('/api/users');
postToUsers({ name: 'John' });
// 데이터 변환
const multiply = curry((a, b) => a * b);
const double = multiply(2);
const triple = multiply(3);
[1, 2, 3].map(double); // [2, 4, 6]
[1, 2, 3].map(triple); // [3, 6, 9]
// 설정 팩토리
const createLogger = curry((prefix, level, message) =>
console.log(`[${prefix}:${level}] ${message}`)
);
const appLogger = createLogger('APP');
const errorLog = appLogger('ERROR');
errorLog('Something went wrong'); // [APP:ERROR] Something went wrong
```
핵심 장점
1. 재사용성: 부분 적용으로 특화된 함수 만들기
2. 가독성: 함수 조합이 명확해짐
3. 테스트: 작은 함수들로 분리되어 단위 테스트 용이
참고자료
👁 0 views
Comments (0)
💬
No comments yet.
Be the first to comment!