SUIN

[JS] 함수형프로그래밍이란? 본문

JavaScript

[JS] 함수형프로그래밍이란?

choi suin 2023. 4. 4. 17:10
728x90

함수형 프로그래밍에 특화된 언어 : haskell, f#, OCaml , Erlang

함수형 프로그래밍을 지원하는 언어 : JavaScript , Kotlin,Go,Python,Java,C++,Rust..


함수형 프로그래밍 언어는 객체지향 프로그래밍(Simula,Smaltalk) 와 C 보다 먼저 나온 언어입니다. 함수형 프로그래밍은 수학의 원리와 밀접한 연관이 있으며 배우는데 시간이 걸리고 난해할 수 있습니다.

그래서 사람의 방식과 가장비슷한 절차지향 프로그래밍 , 객체지향 프로그래밍이 더 보편적으로 많이 쓰여지고 있으며 ,

현재 AI,IOT,빅데이터 ,비트코인 이 뜨기시작하며 방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되면서 함수형 프로그래밍 언어가 다시 주목 받기 시작했습니다.


함수형 프로그래밍에서 함수란?

이미지 : velog.io/@heelieben

  • 파이프라인 외부에서는 내부의 상태를 보거나 접근할 수 없다.
  • 파이프라인 외부에서도 외부의 상태를 보거나 접근할 수 없다.

이런 특징을 가진 파이프라인(함수)들을 가지고 묶어서 프로그램을 구성해 나가는 기법을을 함수형 프로그래밍 이라고 합니다.


함수형 프로그래밍의 특징

1. 순수함수 (Pure function)

// ❌
let num = 1;

function add(a){
	return a+num;
}
// ✅ Pure function
function add(a,b){
	return a+b;
}
const result = add(2,3)
  • 함수에서 외부의 상태 값을 참조하거나 또는 외부의상태를 변경하는 것은 순수 함수라고 볼 수 없습니다
  • 동일한 인자를 넣었을 때 항상 동일한 결과값을 반환하며 언제 선언이 되었는지 외부에 전혀 영향을 받지 않도록 작성을해야합니다.
  • 함수 안에서 외부의 상태 값을 변경(Side Effect) 한다면 그건 함수형 프로그래밍 이아니라 절차 지향 적 프로그래밍의 확률이 높습니다

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

// ❌
let person ={name:'a' ,age:20};

function increaseAge(person){
	person.age = person.age+1;
	return person
}
// ✅ Stateless, Immutability
let person ={name:'a' ,age:20};

function increaseAge(person){
	// 부작용 : 불변성의 데이터 타입이 없다.
	return {...person , age: person.age+1} 
}
  • 함수의 인자로 전달된 데이터를 변경하는 것은 절대 함수형이아니며 전달된 데이터를 변경하는 것이 아니라 새로운 버전의 새로운 오브젝트를 만들어서 결과 값으로 전달해야 합니다.
  • 외부의 상태나 함수의 인자로 전달된 데이터 의 상태를 변경하지 않음으로써 사이드 이펙트 를 만들지 않으므로 불변성 을 유지하기 때문에 여러가지 동시다발적인 멀티 스레딩 환경에서도 안정적으로 동작할 수 있습니다.
    • 부작용 : 함수를 호출하면 외부의 상태가 변경되거나 예상치 못한 에러가 발생
// ✅ Stateless, Immutability
let person = Object.freeze({name:'a' ,age:20});

function increaseAge(person){
	return Object.freeze({...person , age: person.age+1});
}
  • Object.freeze 라는 함수를 통해 Object를 불변성으로 만들 수 있습니다.

3. 선언형 함수 (Expressions)

// ❌
let numbers =[1,2,3];

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

function multiply(number,multiplier){
	return numbers.map(num=> num *multiplier )
}
  • if,switch,for .. 등 여러가지 문장(Expressions)을 사용하는것은 함수현 프로그래밍이 아닙니다.

4. 1급 객체와 고차함수 (Fist-class, Higher-order functions)

함수형 프로그래밍은 1급 객체와 고차함수의 특징을 가지고 있어야 합니다.

//1급 객체
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]))
  • 일급 함수 특징 : 함수를 변수에 할당하거나 함수의 인자로 전달하거나 리턴하는등의 일들을 할 수 있다.
//고차함수
const addToppings = topping => food => food + topping ;

const egg = addToppings('🍳')
const bacon = addToppings('🥓')

console.log(egg(["🥘"])
console.log(bacon(["🥪"])
  • 고차함수 특징 : 함수 자체를 인자로 전달 하거나 함수에서 또 다른 함수를 리턴한다.

함수형 프로그래밍의 장단점

장점

  1. 높은 수준의 추상화를 제공한다
  2. 함수 단위의 코드 재사용이 수월하다
  3. 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

단점

  1. 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
  2. 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
  3. 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다

ui application 특성상 많은 상태 변화가 일어나기 때문에 순수 함수형 프로그래밍 만을 이용하여 코드를 구현하는것은 조금 무리가 있습니다.

함수형과 반응형이 결합된 함수형 반응형 프로그래밍을 이용하거나 객체지향 프로그래밍에서 함수형 프로그래밍의 특징을 결합해서 조금 더 안정적인 프로그래밍을 해 나갈 수 있습니다.