# 함수형 프로그래밍에 대해 설명해 주세요.

* 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 방법이다.

최근 프로그래밍 패러다임은 크게 아래와 같이 구분할 수 있다.

* **명령형 프로그래밍** : 무엇(`What`)을 할 것인지 나타내기보다 어떻게(`How`)할 건지를 설명하는 방식
  * **절차지향 프로그래밍** : 수행되어야 할 순차적인 처리 과정을 포함하는 방식(C, C++)
  * **객체지향 프로그래밍** : 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
* **선언형 프로그래밍** : 어떻게(`How`)할 건지를 나타내기보다 무엇(`What`)을 할 건지를 설명하는 방식
  * **함수형 프로그래밍** : 순수 함수를 조합하고 소프트웨어를 만드는 방식(클로저, 하스켈, 리스프)

**함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.**

## 함수형 프로그래밍의 특징

### 부수효과(Side Effect)

* 부수효과란 다음과 같은 변화 또는 변화가 발생하는 작업을 의미한다.
  * 변수의 값이 변경됨
  * 자료 구조를 제자리에서 수정함
  * 객체의 필드값을 설정함
  * 예외나 오류가 발생하며 실행이 중단됨
  * 콘솔 또는 파일 I/O가 발생함

### 순수 함수

* 위와 같은 부수 효과들을 제거한 함수들을 순수 함수라고 부르며, 함수형 프로그래밍에서 사용하는 함수는 이런 순수 함수들이다.
  * Memory or I/O 관점에서 Side Effect가 없는 함수
  * 함수의 실행이 외부에 영향을 끼치지 않는 함수
* **순수 함수의 장점**
  * 함수 자체가 독립적이며 Side Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있다.
  * Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.

### 1급 객체(First-Class Object)

* 1급 객체란 다음과 같은 것들이 가능한 객체를 의미한다.
  * 변수나 데이터 구조 안에 담을 수 있다.
  * 파라미터로 전달할 수 있다.
  * 반환값으로 사용할 수 있다.
  * 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

**함수형 프로그래밍에서 함수는 1급 객체로 취급받기 때문에 함수를 파라미터로 넘기는 등의 작업이 가능하다. 또한 일반적으로 알고 개발했던 함수들은 함수형 프로그래밍에서 정의하는 순수 함수들과는 다르다는 것을 인지해야 한다.**

### 참조 투명성

* 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
* 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)

<br>

> * **명령형 프로그래밍과 함수형 프로그래밍에서 사용하는 함수는 부수효과의 유무에 따라 차이가 있다.**
> * 그에 따라 함수가 참조에 투명한지 안한지 나뉘어 지는데, 참조에 투명하다는 것은 함수를 실행해도 어떠한 상태의 변화 없이 항상 동일한 결과를 반환하여 항상 동일하게(투명하게) 실행 결과를 참조(예측)할 수 있다는 것을 의미한다.
> * 예를 들어 함수 `f()`에 인자 `x`를 넣고 `f(x)`를 실행하게 되면 `f()`는 입력된 인자에만 의존하므로 항상 `f(x)`라는 동일한 결과를 얻게 되는 것이다.
> * **부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용이하게 하는 것**은 함수형 프로그래밍으로 개발하려는 핵심 동기 중 하나이다.
> * 그리고 이러한 부분은 병렬 처리 환경에서 개발할 때 `Race Condition`에 대한 비용을 줄여줄 수 있다. 왜냐하면 함수형 프로그래밍에서는 값의 대입이 없이 항상 동일한 실행에 대해 동일한 결과를 반환하기 때문이다.

\ <br>

### 참고

* [참고 블로그](https://mangkyu.tistory.com/111)
