> For the complete documentation index, see [llms.txt](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/dev_note/fp/undefined.md).

# 함수형 프로그래밍

## 함수형 프로그래밍이란

> 함수형 프로그래밍은 **수학적 함수(순수 함수)를 사용하고 부수효과를 피하는 프로그래밍 방식**이다.

정의에 따르면 함수형 프로그래밍은 부수효과를 사용하지 않고 순수 함수만을 사용해야 할 것 처럼 보이지만, 애플리케이션 서비스를 만드려면 부수효과는 꼭 필요하며, 순수하지 않은 함수도 사용한다.&#x20;

{% hint style="info" %}
부수효과는 애플리케이션이 실행되는 이유이며, 순수하지 않은 함수를 잘 다룰 수 있는 기술들이 존재한다. (Functor, Monad)
{% endhint %}

### 함수형 프로그래밍 목표

> 부수효과(사이드 이펙트)를 완전히 제거하는 것이 아닌 비즈니스 로직을 처리하는 코드(순수 함수)와 부수효과를 일으키는 코드를 분리하는 것

함수형 프로그래밍에서는 부수효과를 일으키는 부분을 코드에서 분리하고 격리해서 기존의 부수효과로만 다뤘던 작업을 순수한것처럼 다룰 수 있게 추상화 한다.

### 수학적 함수란

> 수학에서 말하는 함수의 정의와 일치하기 때문에 수학적 함수라 불린다.

* 숨은 입출력이 없다. 즉, 값을 반환하는것 외에 부수적으로 일으키는 효과가 없다.&#x20;
* 함수 호출횟수와 상관없이 같은 입력값이 주어지면 항상 동일한 출력값을 반환하는 **참조 투명성**의 특징을 갖고 있다.(예측 가능)

{% hint style="info" %}
**숨은 입출력 코드의 종류**

* **사이드 이펙트**: 값을 반환하는 것 외에 부수적으로 일으키는 효과. ex) 외부, 내부 상태를 변경하는 행위
* **예외**: `try & catch`가 사용된 함수는 예외를 다루는 방식에 따라서 프로그램의 실행 흐름이 변경되는 부수효과가 발생한다.&#x20;
* **내외부 상태에 대한 참조**: 입력값을 제외한 외부 데이터를 참조하는 경우
  {% endhint %}

{% hint style="info" %}
수학에서 함수는 일반적으로 하나의 집합을 다른 집합으로 대응시키는 대응관계를 나타낸다.\
이 때, 첫 번째 집합은 **정의역**이라고 하고, 두 번째 집합은 **치역**이라고 한다.

![](https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FVbxIiAL9c9l7Y5IBwwdV%2F%E1%84%89%E1%85%AE%E1%84%92%E1%85%A1%E1%86%A8%E1%84%8B%E1%85%A6%E1%84%89%E1%85%A5%E1%84%92%E1%85%A1%E1%86%B7%E1%84%89%E1%85%AE.png?alt=media\&token=fcdd7209-08f3-4d09-8e2a-aa0e5de2ec58)
{% endhint %}
