> For the complete documentation index, see [llms.txt](https://jaemedevs-organization.gitbook.io/frontend_study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jaemedevs-organization.gitbook.io/frontend_study/book/functional-programming/ch1.md).

# Chapter 1: 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다

## 🍄 1. 함수형 프로그래밍은 무엇인가요?

* 함수형 프로그래밍을 한마디로 설명하는 것은 어렵다. 함수형 프로그래밍은 넓은 분야에서 쓰고 있다. 학계나 산업 현장에서도 쓰고 있지만 많은 자료가 학계에서 만든 자료라 일반 개발자가 이해하기 어렵고 실용적이지 않다.
* 함수형 프로그래밍은 **수학 함수를 사용하고 부수 효과(side effect)를 피하는 것이 특징인 프로그래밍 패러다임**이다.
* 함수형 프로그래밍은 **부수 효과 없이 순수 함수(pure function)만 사용하는 프로그래밍 스타일**이다.
* **부수 효과**란 함수가 리턴값 이외에 하는 모든 일을 말한다. 예를 들어 메일 보내기나 전역 상태 수정하기 같은 일이 부수 효과이다. 부수 효과는 함수를 부를 때마다 발생하기 때문에 문제가 될 수 있다. 어떤 경우에는 리턴값이 필요해서 불렀지만 의도하지 않게 부수 효과가 발생할 수 있다.
* 부수 효과의 예시
  * 이메일 보내기
  * 파일 읽기
  * 불빛을 깜빡이기
  * 웹 요청을 하기
  * 자동차에 브레이크 밟기
* **순수 함수**란 인자에만 의존하고 부수 효과가 없는 함수이다. 인자에만 의존한다는 말은 같은 인자를 넣으면 항상 같은 결과를 돌려준다는 말이다. 수학에서 함수도 그렇게 동작하기 때문에 순수 함수를 **수학 함수**라고 볼 수 있다. 순수 함수는 다루기 쉽고 이해하기 쉽기 때문에 함수형 프로그래머들이 중요하게 생각한다.

## 🍄 2. 실용적인 측면에서 함수형 프로그래밍 정의의 문제점

### 🌻 2-1. 부수 효과는 필요하다.

* 정의에 따르면 함수형 프로그래밍은 부수 효과를 피해야 하지만, 부수 효과는 소프트웨어를 실행하는 이유이다.
* 이메일을 전송하지 않는 이메일 전송 소프트웨어가 무슨 의미가 있을까? 정의에는 부수 효과를 완전히 쓰지 말라는 것처럼 되어 있지만 필요할 때는 써야 한다.

### 🌻 2-2. 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있다.

* 함수형 프로그래머는 부수 효과가 실제로 필요하지만 문제가 될 수 있다는 것을 알기 때문에 부수 효과를 잘 다루기 위한 도구를 많이 알고 있다. 정의에는 순수 함수만 쓰라는 것처럼 되어 있지만, 함수형 프로그래머는 순수하지 않은 함수도 사용한다. 그리고 순수하지 않은 함수를 잘 다룰 수 있는 기술이 많이 있다.

### 🌻 2-3. 함수형 프로그래밍은 실용적이다.

* 함수형 프로그래밍이 수학적이라 실제 소프트웨어 개발에서 사용하지 않는 것처럼 느껴진다. 하지만 함수형 프로그래밍으로 잘 만들어진 좋은 소프트웨어가 많다.

## 🍄 3. 액션과 계산, 데이터 구분하기

* 함수형 프로그래머는 직감적으로 코드를 세 분류로 나눈다. (액션, 계산, 데이터)
* 액션 함수는 언제, 얼마큼 호출하는지가 중요하기 때문에 부를 때 신중해야 한다. 중요한 이메일을 중복으로 보내거나 전송이 안 될 수 있기 때문이다.

```jsx
// 액션 함수 예시
// 1. 이메일을 보내는 코드
sendEmail(to, from, subject, body);

// 2. 데이터베이스에 저장하면 다른 시스템에서 저장한 데이터를 볼 수 있다.
saveUserDB(user);

// 3. 부를 때마다 다른 시간을 준다.
getCurrentTime();
```

## 🍄 4. 함수형 프로그래머는 부를 때 조심해야 하는 코드를 구분한다.

* **액션**은 부르는 시점에 의존한다.
* **액션**은 호출하는 시점과 횟수에 의존한다. 그래서 호출할 때 조심해야 한다.

## 🍄 5. 함수형 프로그래머는 실행하는 코드와 그렇지 않은 코드를 구분한다.

* **계산**과 **데이터**는 둘 다 부르는 시점이나 횟수가 중요하지 않다.
* 계산과 데이터의 차이는 실행 여부에 있는데, 계산은 실행 가능하나 데이터는 그렇지 않다. 데이터는 정적이고 보이는 그대로이다. 하지만 계산은 실행하기 전까지 어떻게 동작할지 알 수 없다.

```jsx
// 계산 예시
// 계산은 입력값을 계산해 출력하는 것이다.
// 1. 모든 숫자를 더하는 편리한 함수
sum(numbers);
// 2. 같은 문자열을 넣으면 항상 같은 길이를 주는 함수
string_length(str);

// 데이터 예시
// 데이터는 이벤트에 대한 사실을 기록한 것이다.
// 1. 사람에 대한 정보
{ "firstname" : "Eric", "lastname": "Normand" }
// 2. 그냥 숫자 리스트
[1, 2, 3, 4, 5, 6]
```

* 액션과 계산, 데이터를 구분하는 것은 함수형 프로그래밍의 기본 개념이다. 많은 함수형 프로그래밍 기술과 개념은 코드를 액션과 계산, 데이터로 구분하는 것으로부터 시작한다.
* 코드를 만들 때 액션과 계산, 데이터 모두 중요하기 때문에 모두 필요하다. 하지만 액션과 계산, 데이터는 각각 장단점을 가지고 있기 때문에 잘 알고 적절하게 쓰는 것이 좋다. 일반적으로 액션 보다는 계산이 쓰기 쉽고 계산 보다는 데이터가 쓰기 쉽다고 생각한다. 결과적으로 가장 쓰기 좋은 것은 데이터이다.
* 함수형 프로그래머는 액션보다 계산을 좋아하고 계산보다 데이터를 좋아한다.

## 🍄 6. 함수형 프로그래머는 액션과 계산, 데이터를 구분한다.

* 프로젝트 관리를 위해 클라우드 서비스를 만든다고 생각해보자. 여러 클라이언트가 작업 완료 표시를 하면 서버에서 이메일을 통해 알려주는 서비스이다.
* 이 서비스에서 액션과 계산, 데이터는 어떤 것일까? 이 시나리오에서 동작을 구분해보자.

### 🌻 6-1. 1단계: 사용자가 작업 완료를 표시함

* 이것은 UI 이벤트인데 실행 횟수에 의존하기 때문에 **액션**이다.

### 🌻 6-2. 2단계: 클라이언트가 서버로 메시지를 보냄

* 메시지를 보내는 것도 **액션**이다. 그리고 메시지 자체는 나중에 서버에서 해석해야 하는 값이기 때문에 **데이터**이다.

### 🌻 6-3. 3단계: 서버가 메시지를 받음

* 메시지를 받는 것은 횟수에 의존하므로 **액션**이다.

### 🌻 6-4. 4단계: 서버가 데이터베이스를 변경

* 내부 상태를 바꾸는 것은 **액션**이다.

### 🌻 6-5. 5단계: 서버가 누구에게 알림을 보낼지 결정

* 결정하는 것은 **계산**이다. 입력값이 같다면 서버는 항상 같은 결정을 내리기 때문이다.

### 🌻 6-6. 6단계: 서버가 이메일로 알림을 보냄

* 이메일 보내기는 **액션**이다. 같은 메일을 한 번 보내는 것과 두 번 보내는 것은 다르기 때문이다.

## 🍄 7. 함수형 프로그래밍에서는 코드를 세 가지로 분류한다.

### 🌻 7-1. 액션

* 액션은 실행 시점이나 횟수 또는 둘 다에 의존한다.
* 긴급한 메일을 오늘 보내는 것과 다음 주에 보내는 것은 완전히 다르다. 같은 메일을 10번 보내는 것과 한 번 보내는 것 또는 보내지 않는 것은 역시 다르다.
* 함수형 프로그래밍 도구
  * 시간이 지남에 따라 안전하게 상태를 바꿀 수 있는 방법
  * 순서를 보장하는 방법
  * 액션이 정확히 한 번만 실행되게 보장하는 방법

### 🌻 7-2. 계산

* 계산은 입력값으로 출력값을 만드는 것이다. 같은 입력값을 가지고 계산하면 항상 같은 결괏값이 나온다.
* 언제, 어디서 계산해도 결과는 같고 외부에 영향을 주지 않는다.
* 계산은 테스트하기 쉽고 언제든지 몇 번을 불러도 안전하다.
* 함수형 프로그래밍 도구
  * 정확성을 위한 정적 분석
  * 소프트웨어에서 쓸 수 있는 수학적 지식
  * 테스트 전략

### 🌻 7-3. 데이터

* 데이터는 이벤트에 대해 기록한 사실이다.
* 데이터는 실행하는 코드만큼 복잡하지 않기 때문에 다른 것과 구분된다. 알아보기 쉬운 속성으로 되어 있고, 실행하지 않아도 데이터 자체로 의미가 있다. 또 같은 데이터를 여러 형태로 해석할 수 있다.
* 예를 들어 레스토랑에서 발행한 영수증 데이터가 있다고 했을 때 관리자는 이 데이터를 인기 있는 메뉴를 찾기 위해 쓸 수 있고, 고객은 외식비 지출 내역을 알아보기 위해 쓸 수 있다.
* 함수형 프로그래밍 도구
  * 효율적으로 접근하기 위해 데이터를 구성하는 방법
  * 데이터를 보관하기 위한 기술
  * 데이터를 이용해 중요한 것을 발견하는 원칙

## 🍄 8. 액션, 계산, 데이터를 구분하면 어떤 장점이 있을까?

* 함수형 프로그래밍은 요즘 유행하는 분산 시스템에 잘 어울린다.
* 함수형 프로그래밍은 단순한 트렌드가 아니다. 오랫동안 쌓아온 수학 지식을 기반으로 하는 가장 오래된 프로그래밍 패러다임이다.
* 여러 컴퓨터가 네트워크를 통해 통신하기 시작하면 소프트웨어가 복잡해진다. 처리해야 할 메시지는 순서가 섞일 수 있고 중복되기도 하고 유실되기도 한다. 시간에 따라 바뀌는 값을 모델링할 때 동작 방법을 이해하는 것은 중요하지만 쉽지 않다.
* 실행 시점이나 횟수에 의존하는 코드를 없애면, 코드를 더 쉽게 이해할 수 있고 심각한 버그를 막을 수 있다.
* 데이터와 계산은 실행 시점이나 횟수에 의존하지 않는다. 그래서 코드를 데이터와 계산으로 바꿀수록 분산 시스템에서 생기는 여러가지 문제를 해결할 수 있다.
* 액션은 실행 시점과 횟수에 의존하기 때문에 여전히 문제가 되지만, 코드 전체에 영향을 주지 않도록 격리시키면 된다.

## 🍄 9. 함수형 사고가 무엇일까?

* 함수형 사고는 함수형 프로그래머가 소프트웨어 문제를 해결하기 위해 사용하는 기술과 생각을 말한다.
* 함수형 프로그래밍에서 가장 중요하다고 생각하는 두 가지 개념이 있는데 첫 번째는 액션과 계산, 데이터를 구분해서 생각하는 것이고, 두 번째는 일급 추상이라는 개념이다.

## 🍄 10. 정리

* 함수형 사고는 함수형 프로그래밍의 기술과 개념을 말한다.
* 함수형 프로그래머는 코드를 액션과 계산, 데이터로 나눠서 바라본다.
* 액션은 시간에 의존한다. 그래서 사용하기 가장 어렵다. 액션에서 시간에 의존하는 부분을 분리하면 좀 더 다루기 쉽다.
* 계산은 시간에 의존적이지 않다. 다루기 쉽기 때문에 가능한 코드를 계산으로 바꾸는 것이 좋다.
* 데이터는 정적이고 해석이 필요하다. 데이터는 저장하거나 이해하기 쉽고 전송하기 편리하다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jaemedevs-organization.gitbook.io/frontend_study/book/functional-programming/ch1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
