[JavaScript] 함수형 프로그래밍

hyowon·2021년 9월 28일
0

프로그래밍 패러다임마다 장단점이 존재하는데 각각의 특징과 장단점을 잘 알고 적절하게 사용할 줄 아는 것이 중요하기때문에 잘 몰랐던 함수형 프로그래밍에 대해 정리해보았다.

함수형프로그래밍이란?

순수 함수와 보조 함수의 조합을 통해 외부 상태를 변경하는 부수 효과를 최소화해서 불변성(immutability)을 지향하는 프로그래밍 패러다임이다.

함수형프로그래밍의 특징

순수함수 (pure function)

  • 동일한 인수가 전달되면 언제나 동일한 값을 반환하는 함수
  • 어떤 외부 상태에 의존하지도 않고 변경하지도 않는, 즉 부수 효과(side effect)가 없는 함수
function add(a, b) {
  return a + b;
}

console.log(add(1, 2)); // 3
console.log(add(1, 2)); // 3

순수 함수는 동일한 인수가 전달되면 언제나 동일한 값을 반환하기때문에 결과를 예측할 수 있고 테스트하기 편하다.

일급객체

다음의 조건을 만족하는 객체를 일급 객체라고 한다.

  1. 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다.
  2. 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
  3. 함수의 매개변수에 전달할 수 있다.
  4. 함수의 반환값으로 사용할 수 있다.

자바스크립트는 함수를 값과 동일하게 사용할 수 있기때문에 함수형 프로그래밍이 가능하다.

고차함수 (Higher-Order Function, HOF)

  • 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수
// 외부에서 전달받은 f를 n만큼 반복 호출한다.
function repeat(n, f) {
  for (let i = 0; i < n; i++) {
    f(i); // i를 전달하면서 f를 호출
  }
}

const logAll = function (i) {
  console.log(i);
};

// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logAll); // 0 1 2 3 4

const logOdds = function (i) {
  if (i % 2) console.log(i);
};

// 반복 호출할 함수를 인수로 전달한다.
repeat(5, logOdds); // 1 3

함수를 매개변수로 전달할 수 있기때문에 유연한 구조를 갖게된다.
조건문과 반복문 대신 map,reduce 등 고차함수를 사용해서 코드의 가독성을 향상시킨다.

함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.

또 변경 가능한 상태를 원천적으로 배제하기 때문에 프로그래머는 잠금(Lock)과 동기화(Synchronize)와 같은 골치 아픈 스레드 관련 문제에서 벗어나 핵심 로직 구현에 집중할 수 있다.

하지만 UI어플리케이션에서는 많은 상태 변화가 일어나기때문에 함수형 프로그래밍만 이용하기는 어려운 부분이 있다.

자바스크립트는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어이므로 필요할때 적절히 섞어서 사용하면 될 것 같다.

참고

모던 자바스크립트 Deep Dive
https://mangkyu.tistory.com/111
https://engineering.linecorp.com/ko/blog/functional-programing-language-and-line-game-cloud/#lazy-eval
https://www.youtube.com/watch?v=4ezXhCuT2mw

0개의 댓글