프론트엔드✏️/코드캠프

리액트 커링(React Currying)

당근먹는하니 2022. 6. 12. 20:26
728x90
반응형

 

❗️고차함수 

 - 인자값으로 함수를 받거나, 리턴값으로 함수를 반환하는 함수(컴포넌트를 인수로 하는 함수)

 - 일반 컴포넌트를 감싸고 추가 기능을 제공한다. 

 

const EnhancedComponent = higherOrderComponent(OriginalComponent);

 고차 함수에 원래 컴포넌트를 넣으면 기능이 추가된 컴포넌트를 반환한다. 

 

❗️HOC

 - High Order Component

 - "필요한 구조만 상속받아 사용할 수 없을까?" 

 - 컴포넌트를 반환할 수 있다. 

 - 이름은 with로 시작해야 한다.

 

 

❗️커링(currying)

 - 논리학자 하스켈 브룩스 커링(Haskell Brooks Curry) 이름에서 따옴(아마도)

 - 거의 모든 함수형 언어가 공유하는 특징

 - 다인자 함수의 변수 쪼개기(다변수 함수를 일변수 함수 여러개로 쪼개는 것)

 - 중복된 코드를 줄여준다.

 - 실행 시점을 뒤로 미룰 수 있다.

 

function multiply(x)(y) {
	return x * y
}

function multiply(x) {
	return function(y) {
     return x * y
   }
}

// 인자를 두 개 받던 함수가 인자 하나씩을 받는 함수 두 개로 쪼개졌다. 

// 화살표 함수로 나타내면
let multiply = x => y => x * y;
let multipleByDouble = multiply(2);
// 2를 인자로 받는 multiply를 multipleByDouble로 지정한다. 
// 그럼 multipleByDouble은 인자를 받아 그것에 2를 곱하여 돌려주는 함수가 된다.

multiply(2)(10); // 2 * 10 = 20
multipleByDouble(10); // 2 * 10 = 20

multiply(2)(10); multiply에 x로 2를 넣은 함수가 반환되고, 그것(y)에 10을 넣는다.

 

 인자를 두 개 받던 함수가 인자 하나씩을 받는 함수 두 개로 쪼개졌다. 

그리고 multiply(2)를 multipleByDouble이란 함수로 만든다면, 하나의 인자인 x가 2로 고정되고, y만 인자로 받는 함수가 된 것을 알 수 있다. 즉, 일부 인자에 같은 값을 넣어서 사용할 때, 그 값을 고정하는 것을 말한다. 

 인자는 반복 사용 빈도가 높을 수록 상단에, 낮을 수록 하단에 배치한다. 

 

 

function addAdj(adj, name) {
  return adj + " " + name;
}

function addAdj2(adj) {
  return function(name) {
    return adj +" " + name;
  }
}

addAdj("귀여운", "만두"); // '귀여운 만두'

let addCute = addAdj2("귀여운");

addCute("만두"); // '귀여운 만두'

const addAdj3 = (adj) => (name) => adj + " " + name;

addAdj3("귀여운")("만두"); // '귀여운 만두'

const addAdj4 = (name) => addAdj3("귀여운")(name);

addAdj4("만두"); // '귀여운 만두'
addAdj4("만두콩");  // '귀여운 만두콩'

// 혼자 이것저것 해본 것...

 

참고 : https://dev.to/cesareferrari/higher-order-components-and-currying-in-react-fep 

 

 

처음엔 뭔가 했는데 만두 쓰면서 하니까 재밌었다..🥹

728x90
반응형