함수형 프로그래밍(Functional Programming)

a.k.a. mt_big :)·2021년 8월 19일
0
post-thumbnail

정의

함수형 프로그래밍은 함수(외부에서 함수의 내부에 접근할 수 없고, 함수 내부에서 외부로도 접근 불가능)들을 결합하여 프로그램을 완성하는 것이다.

엔터프라이즈급에서 많이 사용되는 객체 지향 프로그래밍을 단순히 함수형 프로그래밍으로 대체하기는 어렵다.

주요 함수형 프로그래밍 언어

HaskellF#OCamlErlang

등장 배경

연도언어비고
1958LISP함수형 프로그래밍 언어(first!)
1962Simula객체 지향 프로그래밍 언어(first!)
1972C
Smalltalk객체 지향 프로그래밍 언어

C보다 훨씬 일찍 등장했지만 수학에서의 함수의 원리와 밀접한 연관성이 있어 사용하기가 난해하여 사람의 사고 방식과 가장 가까운 절차 지향 프로그래밍과 객체 지향 프로그래밍이 보편적으로 많이 사용되어져 왔다.
하지만 AI, IoT, Big Data, Block Chain 등이 각광받게 되면서 방대한 데이터를 빠르게 계산해서 병렬적, 안정적으로 처리하는 것이 중요해짐에 따라 함수형 프로그래밍 언어가 다시 주목을 받기 시작하게 되었다.

특징

순수 함수(Pure Functions)

let num = 1;

// 함수 내부에서 외부의 상태값을 참조하거나 값을 변경하기 때문에 순수 함수가 아니다.
function add(a) {
  return a + num;	// 함수 내부에서 외부의 상태값을 변경하는 것은 절차 지향적 프로그래밍일 확률이 높다.
}
// 순수 함수
// 동일한 인자를 넣었을 때 항상 동일한 결과값을 반환하고, 외부로부터 전혀 영향을 받지 않도록 작성
function add(a, b) {
  return a + b;
}

const result = add(1, 2);

비상태, 불변성의 유지(Stateless, Immutability)

let person = {name: '이름', age: 40};

// 함수의 인자로 전달된 데이터를 변경하는 것은 함수형 프로그래밍이 아니다.
function increaseAge(person) {
  person.age = person.age + 1;
  return person;
}
// stateless, immutability
const person = {name: '이름', age: 40};

function increaseAge(person) {
  // ...person => stateless, Object.freeze => immutability
  return Object.freeze({...person, age: person.age + 1});
}

외부의 상태나 함수에 인자로 전달된 데이터의 상태를 변경하지 않음으로써 side effect를 발생시키지 않는다. 이렇게 불변성을 유지한다면 멀티스레딩 환경에서도 안정적인 동작이 가능하다.

No statement! Expressions Only!!

// 제어문(Control Statement)의 사용 시 함수형 프로그래밍이라 할 수 없다.
let numbers = [1, 2, 3];

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

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

일급 함수(first-class functions)

함수를 변수에 할당하거나 함수에 인자로 전달하거나 리턴하는 등의 일을 할 수 있는 일급 함수

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('후라이');
const bacon = addToppins('베이컨');

console.log(egg('달걀'));		// 달걀후라이
console.log(bacon('훈제'));		// 훈제베이컨 

추가로 알아야 할 개념

  • Monad
  • Semigroup
  • Applicative
  • Monaid
  • Functor
  • Disjunction

0개의 댓글