프로그래밍/함수형 프로그래밍

함수형 프로그래밍의 특징 (1)

mhko411 2021. 8. 5. 21:55
728x90

함수형 프로그래밍의 특징은 다음과 같다.

  1. 순수 함수
  2. 상태를 공유하지 않으며 변화를 감소한다.
  3. 데이터의 제어 흐름과 연산을 추상화하여 선언적으로 작성한다.
  4. Side Effect

지금까지 파악한 특징은 위와 같다. 아직은 함수형 프로그래밍의 특징을 완벽히 이해하지 못했지만 하나씩 파악해가면서 함수형 프로그래밍에 대해 이해해보고자 한다.


순수 함수

첫 번째로 순수 함수에 대해서 알아보려고 한다. 순수 함수의 특징은 다음과 같다.

  • 동일한 인자를 전달하면 항상 동일한 결과를 반환한다.
  • 외부 상태를 변경하지 않는다.

 

두 개의 수를 인자로 받아서 더하는 함수를 작성해보자. 아래의 함수는 동일한 인자를 전달했을 때 항상 동일한 결과를 반환하며 함수 스코프 밖의 상태에 영향을 끼치지않기 때문에 순수 함수라고 볼 수 있다.

function sum(a, b) {
  return a + b;
}

console.log(sum(2, 5));

 

이제는 순수하지 않은 함수를 보자. 먼저 첫 번째 코드는 전달받은 두 개의 인자 이외에 함수 밖에서 선언한 변수를 포함하여 결과를 내고있다. 이는 동일한 인자를 전달하면 동일한 값을 나타내는 순수 함수의 특징을 벗어난다.

당연히 동일한 인자를 전달하면 동일한 값을 나타내는 것이 아닌가? 라고 생각을 했었지만 함수 밖에 선언한 변수 c가 변하면 함수 sum은 동일한 인자를 전달해도 값이 변할 수 있다는 것이다.

let c = 1;

function sum(a, b) {
  return a + b + c; // c가 변하면 함수의 결과도 변한다.
}

console.log(sum(2, 5));

 

아래의 두 번째 코드는 함수가 외부에 영향을 끼치기 때문에 순수 함수가 아니다. 순수 함수는 다른 상태들을 변화시키면 안된다.

let c = 1;
console.log(c); // 1

function sum(a, b) {
  c = 10; // 함수 밖에 선언한 변수를 재할당한다.
  return a + b;
}

console.log(sum(2, 5));
console.log(c); // 10

 

그렇다면 함수형 프로그래밍에서 순수 함수가 왜 중요할까?

함수형 프로그래밍으로 코드를 작성하여 재사용이 가능한 수준 높은 모듈화를 진행하기 위해서 순수 함수의 특징을 활용해야한다. 만약 어떠한 모듈이 외부 상태에 변화를 주거나 동일한 인자이지만 다른 결과를 나타낸다면 재사용이 불가능하고 모듈로서의 기능을 상실한다. 또한 구조가 복잡해질수록 파악이 어렵고 디버깅이 어려워진다.

 

실제로 리액트로 개발을 진행하면서 이러한 부분을 신경쓰지 않고 컴포넌트를 만들다가 코드의 구조가 복잡해지면서 파악하기 어려웠고 다른 곳에서 컴포넌트를 다시 사용하기 어려웠다.