함수형 프로그래밍(FP)

Dan·2022년 3월 15일
0

실무공부

목록 보기
1/12
post-thumbnail

함수형 프로그래밍이란?

함수형 프로그래밍은 객체지향, 절차적 프로그래밍와 같은 프로그래밍 패러다임중 하나이다. 함수형 코드는 객체지향보다 간결하고, 테스트하기 쉬운 경향이 있지만 함수형 코드에 생소하다면 복잡해 보일 수 있다.

함수형 프로그래밍을 이해하기 위해선 몇가지 핵심 개념들을 이해하고 있어야 한다.

  1. 1급 객체 (First-Class Objects || First-class citizens)
  2. 순수 함수 (Pure Functions)
  3. 고차 함수 (Higher-Order Functions)
  4. 함수의 합성 (Composition)
  5. 선언형 vs 명령형 (Declarative Vs. Imperative)
  6. 불변성 (Immutability)

핵심 개념

1급 객체 (First-Class Objects || First-class citizens)

자바스크립트의 함수는 객체이므로 1급 함수라고도 표현될 수 있다.

const sum = (a, b) => a + b;

const resultSum = sum(1, 2);

const sumAgain = (a, b, sum) => sum(a, b);
  • 1급 객체(FIrst Objects)로서 사용될 수 있는 범위
    • 함수를 변수에 담아 변수처럼 사용할 수 있다.
    • 다른 함수의 인자로 넘겨줄 수 있다.
    • 반환 값(return value)으로 사용이 가능하다.
    • 다른 자료구조에 포함 시킬 수 있다.

순수 함수 (Pure Functions)

순수 함수는 함수형 프로그래밍 패러다임에 제일 중요한 개념중 하나이다. 순수함수가 강력한 이유는 항상 같은 결과를 반환해주기 때문에 테스트나 디버깅하기 간편해진다.

const myName = (name) => `Hello ${name}`;

myName("Leonardo") // Should always return "Hello Leonardo"
  • 순수 함수를 충족하기 위한 특징

    • 같은 입력 밧이라면, 항상 같은 결과 값을 반환한다.
    • 부수효과(Side-Effect)를 가지지 않는다.
  • 순수 함수가 아닌 예제

let count = 0;

const increaseCount = (value) => count += value;

고차 함수 (Higher-Order Functions)

함수를 인수로 받거나 함수를 반환하는 함수를 고차 함수라고 한다. 함수를 다루는 함수라고도 볼 수 있다.

const names = ["Leonardo", "Lucas", "Bianca", "José", "Maria", "Joe"];

const sayHiToNames = names.map(name => `Hello ${name}`);
  • 고차 함수는 보통 이럴 때 사용 된다.
    • 콜백 함수, promise, monads등을 사용하여 액션, 효과 또는 비동기 흐름 제어를 추상화 하거나 격리
    • 자바스크립트의 map, filter, reduce 등의 메소들은 다 고차함수다.
    • 재사용이나 합성함수의 목적으로 함수를 부분적으로 인자에 적용하거나 커링함수 생성
    • 함수 리스트를 받고 그 함수들의 합성 함수를 반환해주는 함수

함수의 합성 (Composition)

합성함수란 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 과정을 말한다. 작은 순수함수들로 이루어져 있는 함수형 프로그래밍에선 이런 함수들을 잘 조합해서 더 큰 함수를 만드는게 함수형 프로그래밍의 핵심 개념이라고 할 수 있다.

const splitName = (name) => name.split('_').join(' ');

const returnNameCapitalized = (name) => name.toUpperCase();

console.log(returnNameCapitalized(splitName('leonardo_maldonado')));

선언형 vs 명령형 (Declarative vs Imperative)

함수형 프로그래밍은 선언적 패러다임이다.

const numbers = [1, 2, 3, 4, 5];

const sumNumbers = (n) => n.reduce((acc, current) => acc + current);
  • 선언형 프로그래밍은 결과를 도출해내기 위해 무엇을(What)을 할지에 가깝다.
    • ex)"네 명 앉을자리를 부탁해요"
const numbers = [1, 2, 3, 4, 5];

const sumNumbers = (n) => {

let finalResult = 0;
for (let i = 0; i < n.length; i++) {
  finalResult += n[i];
  }
return finalResult;
}
  • 명령형 프로그래밍은 어떻게(How) 결과를 도출해낼지에 가깝다.
    • ex)"12번 테이블 자리가 비어있습니다. 나와 우리 가족은 저 자리로 걸어가 앉을 것입니다."

불변성 (Immutability)

불변성 객체는 생성된 순간 더 이상 수정 할 수 없는 객체이다.

// 불변이 아닌 변하는(Mutatable) 데이터
function rateColor(color, rating) {
  color.rating = rating;
  return color;
}

console.log(rateColor(color_lawn, 5), rating) // 5
console.log(color_lawn.rating) // 5

// 불변성 데이터
function rateColor(color, rating) {
  return Object.assign({}, color, { rating:rating });
}

console.log(rateColor(color_lawn, 5), rating) // 5
console.log(color_lawn.rating) // 0  *변하지 않음*
  • 원본 객체의 데이터는 수정할 수 없기에, 데이터 변경이 필요한 경우 원본 객체의 복사본을 새로운 객체로 만들어 수정해줘야 한다.

    ❗❗❗ 중요: 자바스크립트 ES6의 fill, pop, sort, splice, unshift, reverse, push 등 의 메소드는 원본 객체를 수정하기에 함수형 프로그래밍에서는 쓰는 것을 금지해야한다.

참고

profile
만들고 싶은게 많은 개발자

0개의 댓글