커링(Currying)은 함수형 프로그래밍의 중요한 개념으로 코드의 재사용성을 향상시킬 수 있지만 쉽게 이해하고 적용하기에는 다소 어려울 수 있다. 이 글의 커링 함수에 대한 기본적인 개념과 더불어 유용하게 사용될 수 있는 사례를 같이 정리해보는 과정을 통해 함수형 프로그래밍 사고로 한 걸음 더 걸어가보자.
입문편 - 커링이란
커링은 카레가 아니다.
커링은
여러 개의 입력을 받는 함수
를
한 개의 입력만 받는 여러 개의 함수
로 변환하는 과정을 의미한다.
커링이라는 이름의 유래에는 20세기 미국의 수학자인 해스켈 커리(Haskell Brooks Curry)가 있다. 커링의 개념을 만든 것은 아니지만 조합 논리와 람다 대수 분야에 기여하며 함수형 프로그래밍 발전에 큰 영향을 끼치신 분으로 그의 이름을 따 커 링이라고 명명하게 되었다. 하스켈(Haskell) 함수형 프로그래밍 언어도 이 분의 이름을 따서 만들어졌다.
함수형 프로그래밍에서 자주 사용되는 기법 중 하나로 하스켈이나 스칼라(Scala)와 같은 함수형 프로그래밍 언어에는 기본적으로 내장되어 있다. 자바스크립트에서는 특유의 유연한 문법으로 이를 구현할 수 있다.
커링 함수 사용하기
커링 함수(Currying Function)란 커링을 통해 생성된 함수를 의미한다.
커링 함수는 한 번에 하나의 매개변수만 전달받는다.
함수를 호출하는
()
를 연속적으로 사용하는 방식을 통해 커링 함수를 연속적으로 호출할 수 있다.
커링 함수는 함수를 반환하기 때문에 고차 함수의 특성을 지닐 수 있다. 고차 함수란 다른 함수를 인자로 받거나 함수를 결과로 반환하는 함수를 말한다.
커링 함수의 장점
재사용성
: 일부 매개변수를 미리 설정하고, 나머지 매개변수에 대해 나중에 처리할 수 있게 함으로써 함수의 재사용성을 높일 수 있다.
모듈성
: 크고 복잡한 함수를 작고 관리하기 쉬운 단위로 분할할 수 있다.
유연성
: 동일한 기본 로직을 효과적으로 재사용할 수 있다.
커링 함수의 단점
성능 저하
: 매개변수가 많아질수록 추가적인 함수 호출과 메모리 할당을 발생시켜 성능 이슈가 발생할 수 있다.
러닝 커브
:익숙하지 않은 사람들에게는 코드의 가독성을 저하시킬 수 있다.
어려운 디버깅
: 함수 호출 구조가 복잡해지고 여러 단계로 나뉘어 있기 때문에 추적이 더 어려워 질 수 있다.
실전편 - 6가지 활용 사례
TIP
변동 가능성이 낮은 인자를 우선하고 높을 수록 뒷 순서로 받는 것이 좋다.
활용 사례 1. 함수의 지연 실행
클로저를 이용해 상태를 보존하고 함수가 지연 실행되도록 할 수 있다. 위 코드에서
double
함수는
multiply
함수의
a
에
2
라는 값을 할당해 자유 변수로 가지는 클로저다.
double
함수를 호출할 때 두 번째 인자를 전달해 최종적으로 계산을 수행하도록 할 수 있다.
활용 사례 2. React 이벤트 핸들러 간소화
리액트 컴포넌트에서 이벤트 핸들러에 추가적인 매개변수를 전달할 때 유용하다. 더 이상
onClick={(e) => handleItemClick(itemId)}
와 같이 선언하지 않아도 된다.
활용 사례 3. API 호출 처리
API 엔드포인트 경로를 확장하거나 데이터 처리 로직을 유연하게 구성할 수 있다.
활용 사례 4. 고차 컴포넌트(HOC)
고차 컴포넌트는 다른 컴포넌트를 인자로 받아 새로운 컴포넌트를 반환하는 함수다. 컴포넌트 간의 공통 로직을 추출해서 재사용하기 위해 사용되는데 여기에 커링을 적용할 수 있다.
활용 사례 5. 팩토리 패턴(Factory Pattern)
팩토리 패턴은 객체 지향 프로그래밍에서 객체 생성을 캡슐화하는 디자인 패턴으로, 동일한 프로퍼티를 가진 여러 작은 객체를 만들어낼 때 유용하다. 커링을 이용하여 재사용 가능한 팩토리 함수를 구현할 수 있다.
이렇게 컴포넌트가 렌더링 된다.
활용 사례 6. Reducer 간소화
커링 함수를 사용하여 Redux 상태 관리의 Reducer를 더 명확하고 간결하게 표현하여 Reducer 함수가 길어지거나 복잡해지지 않을 수 있다. 하지만, 각 액션에 대한 처리를 Reducer 내에서 구현하는 것이 기본 원칙으로 더 직관적이기 때문에 커링을 사용하지 않는 게 유지보수에 더 용이할 수 있다.