Wednesday, September 6, 2023

함수형 프로그래밍의 커링에 대해 알아보자!

목차

함수형 프로그래밍과 커링(Currying)이란?

함수형 프로그래밍은 순수 함수불변성, 그리고 함수의 조합 등을 중심으로 하는 프로그래밍 패러다임입니다. 이 중에서도 '커링'은 함수형 프로그래밍의 핵심 개념 중 하나로, 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수들로 나누어 표현하는 기법을 말합니다.

예를 들어, 두 숫자를 더하는 함수 add(x, y)가 있다고 가정해봅시다. 이를 커링하면 첫 번째 인자 x를 받아 또 다른 함수 (y) => x + y를 반환하는 새로운 함수로 변환할 수 있습니다. 이렇게 변환된 커리된(addCurried)함수는 addCurried(x)(y)와 같은 형태로 사용됩니다.

커링은 코드의 재사용성을 높이고, 특정 동작에 필요한 파라미터들을 분리하여 각각 다른 시점에 전달할 수 있게 해주므로 코드의 유연성을 크게 향상시킵니다.

// 일반적인 add 함수
function add(x, y){
  return x + y;
}

// 커리된 addCurried 함수
function addCurried(x){
  return function(y){
    return x + y;
  }
}
addCurried(5)(3); // returns 8

위 예제에서 보듯이, 'add''addCurried' 모두 동일한 기능을 하지만 사용 방식과 구조가 다릅니다. '커링'은 이처럼 기능적으로 복잡한 문제도 단계별로 간단하게 해결할 수 있도록 돕는 막강한 도구입니다.

더 자세히 알아보기

커링(Currying)의 장점

커링은 함수형 프로그래밍에서 중요한 개념이며, 다음과 같은 여러 가지 장점이 있습니다.

  • 모듈화와 코드 재사용: 커링을 사용하면 공통적으로 사용되는 함수를 모듈화하고 재사용할 수 있습니다. 이를 통해 코드의 중복을 줄이고, 유지보수를 용이하게 할 수 있습니다.
  • 함수 조합: 커리된 함수는 입력값 하나만 받기 때문에 다른 함수와 쉽게 조합될 수 있습니다. 이를 통해 복잡한 로직도 간단한 함수들의 조합으로 표현할 수 있어 코드의 가독성과 유연성을 높일 수 있습니다.
  • 지연 실행: 커리된 함수는 모든 인자가 주어질 때까지 실행을 지연합니다. 이 특성은 비동기 처리나 이벤트 처리 등에서 유용하게 활용됩니다.
// 일반적인 filter와 map
const numbers = [1, 2, 3, 4, 5];
const isEven = num => num % 2 === 0;
const double = num => num * 2;

const evenNumbers = numbers.filter(isEven);
const doubledNumbers = evenNumbers.map(double);

console.log(doubledNumbers); // [4,8]

// 커리된 filter와 map
function curry(fn) {
    return function (x) {
        return function (y) {
            return fn(x,y);
        };
    };
}

let curriedFilter = curry((fn,arr) => arr.filter(fn));
let curriedMap = curry((fn,arr) => arr.map(fn));

let getDoubledEvens = curriedMap(double)(curriedFilter(isEven)(numbers));

console.log(getDoubledEvens); // [4,8]

위 예제에서 보듯이, 'curry', 'curriedFilter', 그리고 'curriedMap'은 모두 동일한 기능을 하지만 사용 방식과 구조가 다릅니다. '커링'은 이처럼 코드의 재사용성과 모듈화를 통해 복잡한 문제도 간결하게 해결할 수 있도록 돕는 훌륭한 도구입니다.

더 자세히 알아보기

커링(Currying)의 예제와 사용법

자바스크립트에서 커링을 사용하는 방법은 매우 간단합니다. 먼저, 여러 개의 인자를 받는 함수를 선언한 후, 이 함수를 하나의 인자만 받도록 변환하는 과정을 거치면 됩니다.

// 일반적인 add 함수
function add(x, y){
  return x + y;
}

// 커리된 addCurried 함수
function addCurried(x){
  return function(y){
    return x + y;
  }
}
addCurried(5)(3); // returns 8

위 코드에서 'add'함수는 두 개의 인자를 받아서 더하는 일반적인 함수입니다. 이를 커링하여 'addCurried'라는 새로운 함수로 만들었습니다. 'addCurried'함수는 첫 번째 인자 x를 받고, 그 결과로 새로운 함수를 반환합니다. 반환된 이 새로운 함수는 다시 두 번째 인자 y를 받아 최종 결과값을 계산합니다.

이렇게 하나의 인자만 받도록 변환된 커리된 함수는 특정 시점에 필요한 파라미터들을 분리하여 전달할 수 있으므로 코드의 유연성과 재사용성을 크게 향상시킵니다.

더 자세히 알아보기

커링(Currying)을 사용하는 대표적인 프로그래밍 언어들

커링은 함수형 프로그래밍 패러다임에서 주로 사용되는 기법입니다. 따라서 함수형 프로그래밍 언어에서는 이 커링이 기본적으로 지원되거나, 간단한 방법으로 구현할 수 있습니다. 다음은 커링을 지원하는 몇 가지 주요 프로그래밍 언어들입니다.

  • Haskell: Haskell은 순수 함수형 프로그래밍 언어로, 모든 함수가 기본적으로 커리된 형태로 정의됩니다.
  • JavaScript: JavaScript는 멀티 패러다임 언어로, 일급 함수를 지원함에 따라 커링과 같은 고차 함수 개념을 쉽게 구현할 수 있습니다.
  • Scala: Scala는 객체지향과 함수형 프로그래밍 패러다임을 모두 지원하는 멀티 패러다임 언어로, 부분 적용과 함께 커링도 지원합니다.

이 외에도 많은 현대 프로그래밍 언어들이 고차함수와 클로저 등의 개념을 통해 커링 구현을 가능하게 하고 있습니다. 이를 통해 개발자들은 높은 수준의 코드 재사용성과 유연성, 그리고 간결한 문법 표현력 등의 이점을 누릴 수 있습니다.

더 자세히 알아보기

0 개의 댓글:

Post a Comment