💻 Dev

🛠️ 처음부터 만드는 Curry — 함수 인자를 부분적으로 받기

커링이란?


함수의 인자를 하나씩 받아서, 필요한 만큼만 호출한 후 나머지 인자를 기다리는 패턴입니다.
```javascript
// ❌ 일반 함수
const add = (a, b, c) => a + b + c;
add(1, 2, 3); // 6
// ✅ 커링된 함수
const curriedAdd = (a) => (b) => (c) => a + b + c;
const step1 = curriedAdd(1); // 함수 반환
const step2 = step1(2); // 함수 반환
const result = step2(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 fetchUser = curry((baseUrl, userId, options = {}) =>
fetch(`${baseUrl}/users/${userId}`, options).then(r => r.json())
);
const apiCall = fetchUser('https://api.example.com');
const getUser = apiCall('123');
getUser({ headers: { 'Auth': 'token' } });
// 배열 필터링
const filter = curry((predicate, array) => array.filter(predicate));
const filterEven = filter(n => n % 2 === 0);
filterEven([1, 2, 3, 4]); // [2, 4]
// 로깅
const log = curry((prefix, value) => {
console.log(prefix, value);
return value;
});
const logUser = log('[USER]');
logUser({ name: 'Alice' }); // [USER] { name: 'Alice' }
```

언제 사용할까?


같은 첫 번째 인자를 반복 사용할 때 — 설정값 고정
고차 함수를 만들 때 — 함수를 반환하는 함수
함수 조합(Compose/Pipe)과 함께 — 더 유연한 파이프라인
콜백 기반 라이브러리에서 — 부분 적용으로 간결하게
참고: 최신 JavaScript에선 `?.` 문법과 기본값 인자가 커링의 많은 사용 사례를 대체합니다. 하지만 함수형 프로그래밍과 고차 함수 설계에는 여전히 핵심 패턴입니다.
[더 알아보기: 함수형 프로그래밍 - MDN Docs](https://developer.mozilla.org/en-US/docs/Glossary/Functional_programming)
💬 0
👁 0 views

Comments (0)

💬

No comments yet.

Be the first to comment!