반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 싱글톤 패턴
  • 도커공식문서
  • try-with-resources
  • 추상 팩터리 패턴
  • 메이븐 페이즈
  • prerendering
  • rust
  • 메이븐 골
  • 빈 검증
  • 플라이웨이트패턴
  • 슬로우 쿼리
  • 자바스크립트
  • 러스트
  • next js app
  • 토비의 스프링
  • Java
  • 외래키 제약조건
  • Next.js
  • 자바
  • 자바스크립트 면접
  • pnpm
  • 이펙티브 자바
  • 객체복사
  • 싱글톤
  • Pre-rendering
  • serverless computing
  • item8
  • 느린 쿼리
  • 자료구조
  • 이펙티브자바
  • 이펙티브 자바 item9
  • 알고리즘
  • 디자인패턴
  • 작업기억공간
  • 자바 디자인패턴
  • 프로그래머의 뇌
  • bean Validation
  • 참조 해제
  • 메이븐 라이프사이클
  • 서버리스 컴퓨팅
  • 팩터리 메서드 패턴
  • 자바 검증
  • 자바스크립트 인터뷰
  • Javadoc 자바독 자바주석 주석 Comment
  • item9
  • 스프링 검증
  • MSSQL
  • NEXT JS
  • item7
  • 싱글턴

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

자바스크립트/인터뷰

Currying function (커링 함수) 이란 무엇인가요?

2023. 1. 18. 00:00

Currying function 이란?

수학자 Haskell Curry 의 이름을 딴 함수입니다. 여러 개의 인자를 받는 함수를 단 하나의 인자만 받는 함수(unary) 로 만드는 과정을 커링(Currying) 이라고 합니다. 커링을 적용하려면, 여러 인자를 받는 함수(n-ary) 를 하나의 인자만 받는 함수 (unary) 로 변환해야 합니다.

커링 기본 개념 예제

const multiArgFunction = (a, b, c) => a + b + c;
console.log(multiArgFunction(1, 2, 3)); // 6

const curryUnaryFunction = (a) => (b) => (c) => a + b + c;
curryUnaryFunction(1); // returns a function: b => c =>  1 + b + c
curryUnaryFunction(1)(2); // returns a function: c => 3 + c
curryUnaryFunction(1)(2)(3); // returns the number 6

고차함수를 이용해 기존에 작성된 함수를 커링하기

/**
 * 2개의 인자를 가진 함수를 커링한다.
 */
function curry(f) {
  return function (a) {
    return function (b) {
      return f(a, b);
    };
  };
}

function sum(a, b) {
  return a + b;
}

const curriedSum = curry(sum);
console.log(curriedSum(10)(20)); // 30

어떤 구조로 위의 코드가 실행되는지 천천히 살펴보면, curry(sum) 의 결과인 curriedSum 은 처음에 대략 아래와 같은 형태를 가지게 됩니다.

function curriedSum(a) {
  return function (b) {
    return sum(a, b);
  };
}

이후에 실행되는 curriedSum(10) 은 아래와 같은 형태를 가지게 됩니다.

function curriedSum10(b) {
  return sum(10, b);
}

이후에 실행되는 curriedSum(10)(20) 은 아래와 같은 형태를 가지게 됩니다.

sum(10, 20);

위는 단적인 예이며, 커링을 잘 사용하면, 코드 재사용성과 함수적인 조합을 향상시켜줄 수 있습니다.

커링 활용하기

function log(date, importance, message) {
  console.log(
    `[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`
  );
}

log(new Date(), "INFO", "HELLO"); // [9:48] [INFO] HELLO

여기 기본 로깅 함수가 있습니다. 로깅 함수를 사용하다보니 보통 시간을 넣는 곳에는 현재 시간만을 넣게 된다는 것을 깨달았습니다. 그리고 두번째 인자로는 INFO, DEBUG, ERROR 등의 한정적인 문자열만 온다는 것을 깨달았다면, 이럴 때 커링을 이용할 수 있습니다.

function curry(f) {
  return function (a) {
    return function (b) {
      return function (c) {
        return f(a, b, c);
      };
    };
  };
}

const logNowInfo = curry(log)(new Date())("INFO");
const logNowError = curry(log)(new Date())("ERROR");
const logNowDebug = curry(log)(new Date())("DEBUG");

logNowInfo("HELLO INFO"); // [10:3] [INFO] HELLO INFO
logNowError("HELLO ERROR"); // [10:3] [ERROR] HELLO ERROR
logNowDebug("HELLO DEBUG"); // [10:3] [DEBUG] HELLO DEBUG

레퍼런스

https://ko.javascript.info/currying-partials
https://github.com/sudheerj/javascript-interview-questions#what-is-the-currying-function

반응형
저작자표시 비영리 (새창열림)

'자바스크립트 > 인터뷰' 카테고리의 다른 글

let 키워드를 var 와 비교하여 설명해보세요  (0) 2023.01.18
pure function (순수 함수) 란 무엇인가요?  (0) 2023.01.18
unary function 이란 무엇인가요?  (0) 2023.01.17
Higher Order Function (고차함수) 란 무엇인가요?  (0) 2023.01.13
First Order Function (일차 함수) 란 무엇인가요?  (0) 2023.01.13
    '자바스크립트/인터뷰' 카테고리의 다른 글
    • let 키워드를 var 와 비교하여 설명해보세요
    • pure function (순수 함수) 란 무엇인가요?
    • unary function 이란 무엇인가요?
    • Higher Order Function (고차함수) 란 무엇인가요?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바