ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 커링(currying)을 이해한다는 것
    IT 2026. 1. 23. 11:00

    커링이라는 단어를 처음 들으면, 많은 사람들이 이렇게 느낍니다.

    “함수형 프로그래밍에서나 쓰는 어려운 개념 아닌가?”


    하지만 커링은 생각보다 낯설지 않은 개념입니다. 오히려 우리는 이미 커링과 아주 비슷한 방식으로 코드를 작성하고 있습니다. 이 글에서는 커링을 수학적 정의나 형식적인 문법이 아니라, 함수를 어떻게 쪼개서 바라볼 것인가라는 관점에서 풀어보려 합니다.

     

    함수는 꼭 한 번에 모든 인자를 받아야 할까

    보통 우리는 이런 함수를 자연스럽게 작성합니다.

    def add(a, b):
        return a + b

    이 함수는 두 개의 값을 한 번에 받아 결과를 만듭니다. 하지만 한 걸음만 물러나서 보면, 이런 질문을 던질 수 있습니다.

    “굳이 두 값을 동시에 받아야 할까?”

     

    만약 하나를 먼저 받고, 나중에 나머지를 받아도 된다면 함수의 모습은 달라질 수 있습니다.

     

    커링의 핵심 아이디어

    커링은 이 질문에 대한 하나의 대답입니다.

    여러 개의 인자를 받는 함수를 인자를 하나씩 받는 함수들의 연속으로 바꾸는 것

    이 말만 보면 추상적이지만, 코드로 보면 훨씬 직관적입니다.

     

     

    파이썬으로 보는 가장 단순한 커링

    def add(a):
        def inner(b):
            return a + b
    return inner

    이제 이 함수는 이렇게 사용할 수 있습니다.

    add_five = add(5)
    result = add_five(3) # 8

    여기서 중요한 점은 add(5)의 결과가 숫자가 아니라 새로운 함수라는 사실입니다. 이 함수는 이미 a=5라는 정보를 기억한 상태입니다.

    이 지점에서 우리는 자연스럽게 이전에 다뤘던 개념을 떠올릴 수 있습니다.

    바로 클로저(closure)입니다.


    커링과 클로저의 관계

    커링은 대부분의 언어에서 클로저 위에서 구현됩니다. 바깥 함수의 인자를 안쪽 함수가 기억하고 있기 때문입니다.

    그래서 커링을 이해하려면 새로운 문법을 외우기보다는, 이렇게 생각하는 편이 좋습니다.

    “일부 인자를 미리 고정한 함수를 만들어낸다”

    이 관점은 실무에서 훨씬 중요합니다.


    커링은 왜 유용할까

    커링의 진짜 가치는 재사용성과 표현력에 있습니다.

    예를 들어 이런 상황을 생각해봅시다.

    def multiply(a, b):
        return a * b

    여기서 항상 어떤 값에 10을 곱해야 한다면, 우리는 보통 함수를 새로 만들거나 람다를 씁니다.

    def times_ten(x):
        return multiply(10, x)

    하지만 커링을 사용하면 이 의도를 더 직접적으로 표현할 수 있습니다.

    def multiply(a):
        def inner(b):
            return a * b
    return inner
    
    times_ten = multiply(10)

    times_ten이라는 이름에는 이미 “10을 곱한다”는 의미가 고정되어 있습니다.


    부분 적용과 커링은 같은 걸까

    여기서 종종 헷갈리는 개념이 등장합니다. 바로 부분 적용(partial application) 입니다.

    • 커링 → 항상 인자를 하나씩 받는 함수로 변환
    • 부분 적용 → 여러 인자 중 일부만 고정

    파이썬에서는 사실 이 둘을 엄밀하게 구분하지 않고 사용하는 경우가 많습니다.

    from functools import partial
    
    add_five = partial(add, 5)

    이 코드는 커링과 매우 비슷한 효과를 냅니다. 중요한 것은 용어보다도, 함수를 미리 조립해두는 사고방식입니다.


    파이썬에서 커링이 기본 문법이 아닌 이유

    하스켈 같은 함수형 언어에서는 커링이 기본 동작입니다. 하지만 파이썬은 그렇지 않습니다.

    이 차이는 파이썬의 철학과 연결됩니다.

    • 명시적인 인자 전달
    • 가독성을 중시하는 함수 시그니처

    파이썬은 커링을 강요하지 않지만, 필요할 때는 언제든 구현할 수 있도록 클로저와 고차함수를 제공합니다.


    커링을 언제 쓰면 좋을까

    커링은 만능 도구는 아닙니다. 하지만 다음과 같은 상황에서는 아주 깔끔한 선택이 됩니다.

    • 설정값을 미리 고정한 함수를 만들 때
    • 고차함수(map, filter 등)와 함께 사용할 때
    • 함수의 역할을 더 명확하게 이름 붙이고 싶을 때

    반대로, 단순한 계산 함수에 무리하게 커링을 적용하면 오히려 가독성을 해칠 수 있습니다.


    마무리하며

    커링은 “어려운 함수형 기법”이 아니라, 함수를 단계적으로 바라보는 사고방식에 가깝습니다.

    한 번에 모든 것을 결정하는 대신, 일부를 먼저 고정하고 나머지를 나중에 완성하는 방식.

    이 관점에 익숙해지면, 함수는 단순한 계산 도구를 넘어 조합 가능한 부품처럼 보이기 시작합니다. 그리고 그 순간부터 커링은 더 이상 낯선 개념이 아닙니다.

Designed by Tistory.