CS

함수형 프로그래밍에 대하여

1. 개요

함수형 프로그래밍은 프로그래밍 패러다임의 일종으로 선언형 프로그래밍에 속한다.

수학적 함수인 순수 함수의 조합으로 프로그램을 설계하는 관점을 의미한다. 

명령형 프로그래밍 vs 선언형 프로그래밍
명령형은 프로그램이 동작하는 과정과 방식(어떻게)을 결정하여 프로그램을 설계한다면,
선언형은 처리할 작업(무엇을)을 결정(선언)하여 프로그램을 설계하는 방법이다.

선언형에는 대표적으로 함수형 프로그래밍, 반응형 프로그래밍이 있다.

함수형 프로그래밍 이전의 패러다임은 절차적 프로그래밍에서 객체 지향 프로그래밍으로 변화했다.

하지만 시간이 지나면서 점점 프로그램의 규모가 커지고 복잡해짐에 따라 문제가 발생하게 됐다.

 

명령형 프로그램은 부작용(또는 부수효과라고 한다)을 이용하여 프로그램을 동작하게 만들기 때문에

프로그램의 버그 발생율을 높이고 동작을 예측하기 어려워 유지 및 보수에 어려움이 있었다.

 

따라서 이런 문제를 해결하기 위해 부작용을 최소화한 함수형 프로그래밍이 주목받기 시작했다.

부작용(Side-Effect)이란?
함수에서 외부의 상태를 변경하는 등 외부에 영향을 줄 때 부작용이 있다고 말한다.
예를 들어, 함수에서 전역 변수를 변경하거나 인자로 넘어온 변수를 변경하는 등의 경우를 의미한다.
이런 부작용은 프로그램을 이해하기 어렵게 만든다.

2. 특징

1) 순수 함수와 1급 객체

순수 함수는 반환값이 오직 함수의 인자에만 의존하여 같은 입력에 대해서 결과가 항상 같은 함수이다.

수학적 함수라고도 부르는 이유는 입력이 x 일 때 결과는 항상 f(x)라는 것을 보장하기 때문이다.

 

즉, 외부에 영향을 주지도 받지도 않기 때문에 부작용이 없으며 참조 투명성을 갖는다.

참조 투명성과 참조 불투명성
함수의 반환값이 외부의 상태를 의존(참조)하는 경우 참조 불투명성을 갖는다고 말한다.
반대로 외부의 상태를 이용하지 않으면 참조 투명성을 갖는다고 말한다.

또한 함수형 프로그래밍에서 함수는 1급 객체로 관리된다는 특징이 있다.

1급 객체는 다음과 같은 특징이 있다.

  • 함수의 반환값으로 사용할 수 있다.
  • 함수의 매개변수로 사용할 수 있다.
  • 변수 또는 상수에 대입할 수 있다.

2) 익명 함수와 고차 함수

1급 객체의 특징으로 인해 함수는 마치 값처럼 취급되서 익명 함수, 고차 함수같은 응용이 가능하다.

 

익명 함수는 이름을 부여할 필요없이 함수 작성이 가능하게 해주고,

고차 함수는 함수를 인자로 받는 함수로 Swift에서 map, reduce, filter 같은 함수가 해당된다.


3. 장단점

1) 장점

함수형 프로그램은 순수 함수의 조합으로 이루어져 있기 때문에 부작용이 없고 참조 투명성을 갖는다.

따라서 프로그램의 동작을 이해하고 예측하는데 용이하다.

함수형 프로그래밍으로 프로그램을 설계하는 가장 큰 이유이다.

 

또한 함수가 외부에 영향을 주지 않고 독립적인 상태를 가져서 Thread-Safe하다.

그러므로 멀티스레딩(동시성 프로그래밍) 환경에서 병렬 처리가 매우 용이하다.

2) 단점

순수 함수의 구현이 코드의 가독성을 해칠 수 있고

아무런 부작용 없이 오직 순수 함수만을 조합해서 프로그램을 설계하기 어렵다.


참고 문서

함수형 프로그래밍이란?

함수형 프로그래밍 - 위키백과

함수형 프로그래밍