안녕하세요!
함수형 프로그래밍(Function Programming)은 자바스크립트에서 점점 더 주목받고 있는 프로그래밍 패러다임입니다. 그중에서도 **커링(Currying)**은 함수형 프로그래밍의 핵심 개념 중 하나로, 함수의 재사용성 및 가독성을 높이는 데 중요한 역할을 합니다. 이번 글에서는 커링의 개념과 기본 원리를 상세히 설명하고, 이를 이해하기 위한 다양한 예제를 소개하겠습니다.
1. 커링(Currying)이란?
1.1 커링의 정의
커링(Currying)은 여러 개의 인수를 받는 함수를 하나의 인수만 받는 함수들의 연속으로 변환하는 기법입니다.
즉, 하나의 함수가 여러 인수를 받는 대신, 첫 번째 인수를 받은 후 새로운 함수를 반환하고, 이 새로운 함수가 다음 인수를 처리하는 방식으로 동작합니다.
예를 들어, 다음과 같은 함수가 있다고 가정해봅시다.
function add(a, b) {
return a + b;
}
이 함수를 커링 방식으로 변환하면 다음과 같이 표현할 수 있습니다
function curriedAdd(a) {
return function (b) {
return a + b;
};
}
위의 curriedAdd 함수는 호출할 때 인수를 하나씩 전달합니다
const addTwo = curriedAdd(2); // 첫 번째 인수 2를 고정
console.log(addTwo(3)); // 5 (2 + 3)
console.log(addTwo(10)); // 12 (2 + 10)
결과적으로, 커링을 통해 함수가 단일 책임 원칙(Single Responsibility Principle)을 따르며, 재사용성과 유연성이 증가합니다.
1.2 커링의 목적
커링은 단순히 함수의 형태를 변환하는 데 그치지 않고, 다음과 같은 목적을 가지고 있습니다:
- 재사용성 증가
특정 인수를 고정한 새로운 함수를 쉽게 생성할 수 있습니다. - 가독성 향상
복잡한 로직을 단계적으로 분리하여 코드를 더 쉽게 읽을 수 있습니다. - 유연한 함수 조합
함수형 프로그래밍에서 자주 사용되는 **함수 조합(Composition)**과 잘 어울립니다.
2. 커링의 기본 원리
커링의 핵심은 부분 적용(Partial Application)입니다.
부분 적용이란, 함수의 일부 인수를 고정하여 새로운 함수를 생성하는 것을 말합니다. 커링은 이 부분 적용을 체계적으로 수행하는 방식입니다.
2.1 일반 함수와 커링 함수 비교
일반 함수
일반적으로 함수는 모든 인수를 한 번에 받아서 결과를 반환합니다
function multiply(a, b, c) {
return a * b * c;
}
console.log(multiply(2, 3, 4)); // 24
커링 함수
커링된 함수는 하나의 인수만 받고, 나머지 인수를 처리하는 새로운 함수를 반환합니다
function curriedMultiply(a) {
return function (b) {
return function (c) {
return a * b * c;
};
};
}
console.log(curriedMultiply(2)(3)(4)); // 24
이처럼, 커링된 함수는 각 인수를 하나씩 처리하며, 최종적으로 모든 인수가 전달되었을 때 결과를 반환합니다.
2.2 커링의 동작 과정
커링의 동작 과정을 단계별로 살펴보겠습니다.
- 첫 번째 인수 처리
커링된 함수는 첫 번째 인수를 받습니다. 이때, 새로운 함수가 반환됩니다. - 두 번째 인수 처리
반환된 함수는 두 번째 인수를 받아 새로운 함수를 반환합니다. - 최종 결과 반환
모든 인수를 처리한 후 최종 결과를 반환합니다.
function curriedAdd(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
const step1 = curriedAdd(2); // 첫 번째 인수 2 처리
console.log(step1); // [Function: b]
const step2 = step1(3); // 두 번째 인수 3 처리
console.log(step2); // [Function: c]
const result = step2(4); // 세 번째 인수 4 처리
console.log(result); // 9 (2 + 3 + 4)
3. 커링의 장점
3.1 함수 재사용성 증가
커링을 통해 특정 인수를 고정하여 새로운 함수를 쉽게 생성할 수 있습니다. 이를 통해 함수의 재사용성을 크게 높일 수 있습니다.
예제: 단위 변환 함수
function convertCurrency(rate) {
return function (amount) {
return rate * amount;
};
}
const usdToEur = convertCurrency(0.85); // USD → EUR 변환 고정
console.log(usdToEur(100)); // 85
console.log(usdToEur(200)); // 170
const usdToJpy = convertCurrency(110); // USD → JPY 변환 고정
console.log(usdToJpy(100)); // 11000
3.2 가독성 향상
복잡한 로직을 단계적으로 분리하여 코드의 가독성을 높일 수 있습니다.
예제: 필터링 로직
function isInRange(min) {
return function (max) {
return function (value) {
return value >= min && value <= max;
};
};
}
const isTeenager = isInRange(13)(19); // 13~19세 범위 고정
console.log(isTeenager(15)); // true
console.log(isTeenager(25)); // false
4. 커링의 구현 방법
커링은 직접 구현할 수도 있고, 라이브러리를 사용할 수도 있습니다.
4.1 수동으로 구현하기
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function (...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
// 사용 예제
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24
4.2 Lodash 라이브러리 활용
Lodash는 커링을 쉽게 구현할 수 있는 유틸리티 라이브러리를 제공합니다.
const _ = require('lodash');
function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = _.curry(multiply);
console.log(curriedMultiply(2)(3)(4)); // 24
console.log(curriedMultiply(2, 3)(4)); // 24
'JavaScript' 카테고리의 다른 글
[JavaScript] 순수 함수(Pure Function) (0) | 2025.01.03 |
---|---|
[JavaScript] 프로토타입으로 상속하기 (0) | 2024.12.25 |
[JavaScript] 클래스와 객체 생성 (0) | 2024.12.16 |
[JavaScript] 구조 분해 할당(Destructuring Assignment)으로 API 응답 처리하기 (2) | 2024.12.10 |
[JavaScript] OpenStreetMap지도에서 두 지점의 경로 출력 (0) | 2024.12.08 |