All Articles

함수형 프로그래밍(FP)

순수함수를 조합하고, 데이터의 불변성을 최대한 보장함으로써 부수효과를 최소화하는 프로그래밍 패러다임이다.

함수형 프로그래밍(Functional Programming)은 객체지향 프로그래밍에 비해 신규 등장한 개념이다. 그래서인지, 객체지향형보다 개념정립이 명쾌하게 된 자료를 찾아보기 어려웠다. 객제지향 프로그래밍처럼 “N대 개념” 이런 식의 정형화된 설명이면 좋겠지만, 그렇게 정리하긴 어려워서 자주 등장하는 개념을 위주로 정리했다.

순수함수

  • 동일한 입력에는 항상 같은 값을 반환해야 한다. 그러기 위해, 함수 외부의 변수를 사용하지 말고 오로지 파라미터만으로 로직을 꾸린다고 생각하면 편하다.
  • 부수효과(Side Effect)가 없다.
  • 순수함수의 경우, 입력값에 대한 결과를 예상할 수 있어서 테스트가 용이하다.

불변성

  • 함수형 프로그래밍에서는 데이터가 변할 수 없다.
  • 데이터 변경이 필요한 경우, immutable하게끔 그 데이터를 복제한 후 변경해서 쓴다.

선언형 프로그래밍

  • 명령형 프로그래밍은 How를 작성하고, 선언형 프로그래밍은 What을 작성한다. 아래 예시에서 차이를 보자.

    // 명령형 프로그래밍
    function double (arr) {
      let newArr = [];
      for (let i = 0; i < arr.length; i++){
        newArr.push(arr[i] * 2);
      }
      return newArr
    }
    
    // 선언형 프로그래밍
    function double (arr) {
      return arr.map((item) => item * 2)
    }

고차함수(Higher-order Function)

  • 리액트에서의 HOC와 비슷한 개념
  • 함수에 함수를 파라미터로 전달할 수 있다.
  • 함수의 반환값으로 함수를 사용할 수 있다.

합성함수(Function composition)

  • 둘 이상의 함수를 조합하는 방법이다.
  • 메서드 체이닝 방식으로 사용한다.
  • 유명한 라이브러리인 lodash가 대표적이다.

커링(Curring)

  • 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 하나씩 받도록 하는 패턴이다.
  • 커링의 장점은, 당장 n개의 파라미터를 모두 채울 수 없더라도, 있는 파라미터를 이용해 우선 부분 실행해둘 수 있다는 것이다.
  • Wrapper 구조라 가독성은 좀 떨어진다.

    const callSomeone = greeting => {
      return name => {
        console.log(greeting + "! " + name);
      };
    };
    
    callSomeone("Hello")("Hyunsang"); // Hello! Hyunsang
    
    const sayHelloSomeone = callSomeone("Hello");
    sayHelloSomeone("Hyunsang"); // Hello! Hyunsang

그밖에 1급 객체(1급 시민) 등의 개념도 나오지만, 이는 기회가 되면 따로 다루는 편이 좋겠다.


[참고자료]
https://velog.io/@kyusung/함수형-프로그래밍-요약
https://www.youtube.com/watch?v=jVG5jvOzu9Y