프로그래밍/Javascript

함수형 프로그래밍의 핵심 개념: 커링(Currying) 완벽 가이드

shimdh 2025. 2. 15. 13:17
728x90

프로그래밍에서 효율적인 코드 작성을 위해 함수형 프로그래밍 기법이 점점 더 중요해지고 있습니다. 특히 커링(Currying) 은 코드의 재사용성을 극대화하고 유지보수성을 높이는 핵심 기법 중 하나입니다.

이번 포스트에서는 커링이 무엇인지, 왜 중요한지, 그리고 실무에서 어떻게 활용할 수 있는지를 상세하게 설명합니다. 실용적인 예제와 함께 커링의 장점을 살펴보겠습니다.


🧐 커링(Currying)이란?

커링이란 다중 인자를 받는 함수를 여러 개의 단일 인자 함수로 변환하는 기법을 의미합니다.

🔹 커링의 기본 개념

일반적으로 자바스크립트에서는 다음과 같이 다중 인자를 받는 함수를 정의합니다.

function add(a, b) {
    return a + b;
}

console.log(add(3, 5)); // 8 출력

커링을 적용하면 위 함수는 다음과 같이 변환됩니다.

function add(a) {
    return function(b) {
        return a + b;
    };
}

const add3 = add(3);
console.log(add3(5)); // 8 출력 (3 + 5)

여기서 add(3)을 호출하면 3을 고정한 새로운 함수가 생성되며, 이후 add3(5)를 호출하면 최종 연산이 수행됩니다.

🔹 커링이 중요한 이유

  • 재사용성 증가: 미리 일부 인자를 설정하여 특정 역할을 하는 함수를 쉽게 만들 수 있습니다.
  • 가독성 향상: 복잡한 로직을 단순하게 나누어 코드의 명확성을 높일 수 있습니다.
  • 유연한 함수 조합: 특정 값을 사전에 설정하여 다양한 상황에서 동일한 로직을 활용할 수 있습니다.

💡 커링의 실용적인 예제

🏷️ 1. 기본적인 커링 적용 예제

커링을 활용하면 특정 값을 사전에 설정하고 이후 필요한 값을 추가로 전달할 수 있습니다.

function multiply(a) {
    return function(b) {
        return a * b;
    };
}

const double = multiply(2);
console.log(double(10)); // 20 출력
console.log(double(5)); // 10 출력

여기서 multiply(2)를 호출하면 2를 미리 적용한 새로운 함수 double이 생성됩니다. 이후 double(10), double(5)를 호출하면 각각 20, 10이 출력됩니다.


🏷️ 2. API 요청을 위한 커링 활용

웹 개발에서는 API 요청을 보낼 때 메서드(GET, POST 등)와 URL을 설정하는 경우가 많습니다.

function apiRequest(method) {
    return function(url) {
        return function(data) {
            console.log(`Sending ${method} request to ${url} with data:`, data);
        };
    };
}

const postToAPI = apiRequest('POST')('https://api.example.com/data');
postToAPI({ username: 'JohnDoe', password: '12345' });

// 출력: Sending POST request to https://api.example.com/data with data: { username: 'JohnDoe', password: '12345' }

이 코드의 장점:
POST 요청을 여러 곳에서 사용할 수 있도록 재사용 가능한 함수 생성
✅ 특정 API URL을 미리 정의해두고 반복적인 코드 작성을 줄임


🏷️ 3. 스타일링 함수 적용

프론트엔드 개발에서 특정 스타일을 적용할 때 커링을 활용하면 코드의 재사용성을 높일 수 있습니다.

const applyStyle = (property) => (value) => (element) => {
    element.style[property] = value;
};

const setBackgroundColor = applyStyle('backgroundColor');
const setRedBackground = setBackgroundColor('red');

const div = document.createElement('div');
setRedBackground(div);
document.body.appendChild(div); // 빨간색 배경을 가진 div 생성

이 코드의 장점:
✅ 특정 스타일 속성을 미리 정의하고 여러 요소에 쉽게 적용 가능
모듈화된 스타일 적용으로 가독성과 유지보수성 향상


⚠️ 커링을 사용할 때 주의할 점

커링은 강력한 기법이지만 모든 경우에 적합한 것은 아닙니다. 다음과 같은 점을 고려해야 합니다.

❗ 1. 과도한 중첩으로 인한 가독성 저하

커링을 남용하면 함수가 과도하게 중첩되어 가독성이 떨어질 수 있습니다.

function example(a) {
    return function(b) {
        return function(c) {
            return function(d) {
                return a + b + c + d;
            };
        };
    };
}

console.log(example(1)(2)(3)(4)); // 10 출력

위 코드처럼 너무 깊게 중첩된 함수는 오히려 이해하기 어렵고, 디버깅이 복잡해질 수 있습니다.

❗ 2. 성능 문제

커링을 사용하면 함수 호출이 많아지므로 퍼포먼스에 영향을 줄 수 있습니다.
특히 대량의 데이터를 다룰 때는 주의해야 합니다.

❗ 3. 기존 함수와의 혼용

일반적인 다중 인자 함수와 커링된 함수가 혼용될 경우 코드 일관성이 깨질 수 있습니다.
이러한 문제를 해결하기 위해서는 적절한 규칙을 정하고 일관성 있는 스타일로 작성하는 것이 중요합니다.


🎯 결론: 커링은 언제, 어떻게 사용해야 할까?

커링은 효율적인 함수 조합과 코드의 재사용성을 높이는 데 매우 유용한 기법입니다. 하지만 무조건 적용하는 것이 아니라, 다음과 같은 상황에서 사용하면 효과적입니다.

재사용성이 필요한 경우: API 요청, 스타일 적용, 데이터 변환 등
반복되는 패턴을 줄이고 싶은 경우: 특정 로직을 미리 정의하고 재활용할 때
코드를 더 모듈화하고 싶은 경우: 가독성과 유지보수성을 높이기 위해 \

728x90