[필수지식] 함수형 프로그래밍이란?

Yongjin·2021년 10월 10일
4

필수지식

목록 보기
4/4
post-thumbnail

함수형 프로그래밍


1. Pure Functions

// X
const num = 1;

function add(a) {
  return a + num;
}
// O, Pure Functions
function add(a, b) {
  return a + b;
}

const result = add(2, 3);

Pure Functions (순수 함수)

  • 동일한 인자를 넣었을 때 항상 동일한 결과 값을 반환
  • 언제 선언이 되었는지, 외부에 전혀 영향을 받지 않음
  • 함수에서 외부의 상태 값을 참조하거나 외부의 상태를 변경하지 않음

2. Stateless, Immutability ( 비상태, 불변성 )

  • 함수에 인자로 전달된 데이터를 변경하지 않음
  • 새로운 버전의 오브젝트를 만들어서 결과 값으로 전달해야 함
    • side effect 를 만들지 않으므로 불변성을 유지할 수 있음
    • 여러가지 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있음

side effect : 함수를 호출하면 외부의 상태가 변경되거나, 예상하지 못한 에러가 발생

// X
const person = { name: 'kim', age: 20 };

function increaseAge(person) {
  person.age = person.age + 1;
  return person;
}
// O, Stateless, Immutability
const person = Object.freeze({ name: 'kim', age: 20 })

function increaseAge(person) {
  return { ...person, age: person.age + 1};
}

3. Expressions Only

  • expressions 를 사용
  • if, for, switch 와 같은 여러가지 문장 사용을 자제
// X
const numbers = [1, 2, 3];

function multiply(number, multiplier) {
  for (let i = 0; i < numbers.length; i++) {
    number[i] = number[i] * multiplier;  
  }
}
// O, expressions

function multiply(numbers, multiplier) {
  return numbers.map(num => num * multiplier);
}

4. First-class and higher-order functions

  • First Class 의 특징과 고차함수 의 속성을 가지고 있어야 함

First Class (일급함수) : 다른 데이터와 마찬가지로 함수를 변수에 할당하거나 함수에 인자로 전달하거나 리턴하는 등의 일들을 할수 있음

고차함수 : 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴하는 속성을 가진 함수

// First-class
const addTwo = a => a + 2;
const multiplyTwo = a => a * 2;
const transform = numbers => numbers.map(addTwo).map(multiplyTwo);

console.log(transform([1, 2, 3, 4]);  // [6, 8, 10, 12] 
// higher-order functions
const addToppings = topping => food => food + topping;
const egg = addToppings('E');
const bacon = addToppings('B');

console.log(egg('K'));     // KE
console.log(bacon('J'));  // JB

references


드림코딩 - 함수형프로그래밍

profile
성장하는 개발자

0개의 댓글