자바스크립트에서 'this' 키워드를 활용한 커링 함수 구현 방법

커링(currying)은 함수를 변환하는 기술로, 여러 개의 인자를 갖는 함수를 하나의 인자를 받는 함수들의 연속으로 변환하는 것을 말합니다. 이는 함수의 재사용성을 증가시켜주고, 코드의 모듈화와 가독성을 향상시키는데 도움을 줍니다. 이번 포스트에서는 자바스크립트에서 ‘this’ 키워드를 활용하여 커링 함수를 구현하는 방법에 대해 알아보겠습니다.

기본적인 커링 함수 구현

커링 함수를 구현하기 위해서는 ‘this’ 키워드를 활용하여 함수를 반환하는 함수를 작성해야 합니다. 다음은 기본적인 커링 함수의 예시입니다.

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function (...moreArgs) {
        return curried.apply(this, args.concat(moreArgs));
      };
    }
  };
}

위의 코드에서 curry 함수는 fn을 인자로 받아서 새로운 함수를 반환합니다. 반환된 함수인 curried 함수는 인자를 받아서 처리합니다. 인자의 개수가 fn의 파라미터 개수보다 많거나 같으면 fn을 실행하고, 그렇지 않으면 다시 curried 함수를 호출하여 추가 인자를 받아서 실행합니다.

‘this’ 키워드 활용

만약 커링 함수 내에서 ‘this’ 키워드를 활용해야 한다면, 위의 예시에서 curried.apply(this, args.concat(moreArgs))와 같이 ‘this’ 키워드를 전달해주어야 합니다. ‘this’가 무엇을 참조하는지는 실행 시점에 결정되므로, 커링 함수를 사용하는 곳에 따라서 ‘this’가 달라질 수 있습니다.

function sayHello(name, message) {
  console.log(`${message}, ${name}!`);
}

const greet = curry(sayHello);
const greeting = greet("John");
greeting("Hello"); // 출력: Hello, John!
greeting.call({ language: "en" }, "Hi"); // 출력: Hi, John!

위의 예시에서 sayHello 함수는 namemessage 두 개의 인자를 받아서 메시지를 출력합니다. curry 함수로 sayHello 함수를 커링하고, greet 함수를 생성합니다. greet 함수는 첫 번째 인자인 name을 받아서 새로운 함수를 반환하는데, 이때 ‘this’ 키워드를 고려하여 반환된 함수를 호출할 때 ‘this’ 값을 전달합니다. greeting 함수는 greet 함수에 name을 전달하여 생성된 함수입니다. 이때 ‘this’ 값을 전달해주지 않으면 greeting 함수 내에서 ‘this’는 전역 객체를 가리키게 됩니다.

커링 함수는 함수형 프로그래밍과 함께 사용될 때 매우 유용합니다. ‘this’ 키워드를 활용하면 더욱 다양한 상황에 대응할 수 있으며, 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

#JavaScript #currying