자바스크립트에서 Currying을 사용하여 함수를 어떻게 팩토리로 활용할 수 있나요?

커링(Currying)은 함수의 일부 파라미터를 고정하여 더 적은 개수의 파라미터를 받는 새로운 함수를 생성하는 개념입니다. 이를 통해 함수를 팩토리로 활용할 수 있습니다. 팩토리는 생성자 함수를 호출하여 객체를 생성하는 과정을 추상화한 함수입니다. 자바스크립트에서 Currying을 사용하면, 동적인 파라미터를 받는 팩토리 함수를 만들 수 있습니다.

아래는 자바스크립트에서 Currying을 사용하여 함수를 팩토리로 활용하는 예시 코드입니다.

// 고정된 파라미터를 받는 Currying 함수
const curry = (fn, ...args) => {
  if (args.length >= fn.length) {
    return fn(...args);
  }
  return (...moreArgs) => curry(fn, ...args, ...moreArgs);
}

// 객체를 생성하는 팩토리 함수
const createUser = (name, age, gender) => {
  return {
    name,
    age,
    gender
  };
}

// Currying을 사용하여 객체 생성을 추상화한 팩토리 함수 생성
const curriedCreateUser = curry(createUser);

// 추상화된 팩토리 함수를 사용하여 객체 생성
const user1 = curriedCreateUser('John')(25)('male');
const user2 = curriedCreateUser('Emily')(30)('female'); 

console.log(user1); // { name: 'John', age: 25, gender: 'male' }
console.log(user2); // { name: 'Emily', age: 30, gender: 'female' }

위 예시 코드에서 curry 함수는 Currying을 구현한 함수입니다. 이 함수는 인자로 받은 함수 fn...args를 결합하여 새로운 함수를 반환합니다. curry 함수는 args의 길이가 fn 함수의 파라미터 개수보다 크거나 같을 경우에는 fn 함수를 호출하고, 그렇지 않을 경우에는 더 많은 인자를 받을 수 있는 새로운 함수를 반환합니다.

createUser 함수는 객체를 생성하는 팩토리 함수로, 이름, 나이, 성별을 인자로 받아 해당 속성들을 가진 객체를 반환합니다.

curriedCreateUser 함수는 createUser 함수를 Currying을 사용하여 추상화한 팩토리 함수입니다. 이 함수는 이름, 나이, 성별을 각각 하나의 인자로 받는 함수를 반환합니다. 이렇게 Currying을 사용하면 필요한 인자를 여러 번에 나누어 넣을 수 있으며, 가독성을 높일 수 있습니다.

위에서 curriedCreateUser 함수를 사용하여 user1user2 객체를 생성하였습니다. curriedCreateUser('John')(25)('male')은 이름이 ‘John’이고, 나이가 25이며, 성별이 ‘male’인 객체를 생성하는 것을 의미합니다. curriedCreateUser('Emily')(30)('female')은 이름이 ‘Emily’이고, 나이가 30이며, 성별이 ‘female’인 객체를 생성하는 것을 의미합니다.

Currying을 사용하여 함수를 팩토리로 활용하면 쉽게 객체를 생성하는 추상화된 팩토리 함수를 구현할 수 있습니다. 이를 통해 코드의 가독성을 높이고, 유연하게 객체를 생성할 수 있습니다.

#Currying #함수팩토리