조컴퓨터

챕터 1. 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다. 본문

책읽기/쏙쏙 들어오는 함수형 코딩

챕터 1. 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다.

챠오위 2022. 8. 5. 15:15

챕터 1에서 중점적으로 볼 내용은 ?

- 함수형 사고가 무엇인지

- 함수형 프로그래머가 코드를 바라볼 수 있는지

 

 

함수형 프로그래밍은 무엇인가요?

함수형 프로그래밍(Functional Programming, FP) 이란 ?

- 수학 함수를 사용하고 부수 효과(side effect) 를 피하는 것이 특징인 프로그래밍 패러다임

- 부수 효과 없이 순수 함수(pure function) 만 사용하는 프로그래밍 스타일

 

* 부수 효과(side effect) 란 ? 

함수가 리턴값 이외에 하는 모든 일들을 뜻한다. 

예) 메일 보내기, 전역 변수 수정하기 등

 

** 순수 함수(pure function) 란 ?

인자에만 의존하고 부수 효과가 없는 함수이다.

이때 인자에만 의존한다는 말은 a 를 넣었을 때 항상 b 라는 값이 나오는 것을 뜻한다.

 

정의에 따르면 함수형 프로그래머는 항상 부수 효과를 피하고 순수 함수만을 사용해야 할 것 같지만, 실제 함수형 프로그래머는 부수 효과와 순수하지 않은 함수를 사용한다. 

 

 

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

위의 함수형 프로그래밍에 대한 정의를 살펴보면 이 내용은 실용적인 측면에서 세 가지의 오류가 있음을 알 수 있다.

 

문제 1. 부수 효과는 필요하다.

정의에 따르면 함수형 프로그래밍은 부수 효과를 피해야 하지만, 부수 효과는 소프트웨어를 실행하는 이유이다. 이메일을 전송하지 않는 이메일 전송 프로그래밍이 무슨 소용이겠는가 ? 필요할 때는 써야 한다.

 

문제 2. 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있다.

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

 

문제 3. 함수형 프로그래밍은 실용적이다.

정의에 따르면 함수형 프로그래밍이 수학적이라 실제 소프트웨어 개발에서 잘 사용되지 않는 것처럼 느껴진다. 하지만 함수형 프로그래밍으로 잘 만들어진 프로그램이 많이 있다. 

 

학문적 지식으로써 함수형 프로그래밍을 이해했을 때와 실용적인 측면에서 함수형 프로그래밍을 이해했을 때 많은 차이가 있다는 것을 알 수 있다. 학문적인 입장에서 바라보면 오롯하게 순수 함수만 사용하여 부수 효과를 낼 수 없으므로 무용지물이라 느껴지지만, 실용적 측면에서는 순수하지 않은 함수를 사용함으로써 부수 효과를 지향하는 것이 함수형 프로그래밍이다. 물론 그것을 가능하게 하는 많은 도구들이 있다는 것을 알게 되었다. 이 도구는 무엇일까 궁금하지만 일단 다음 내용을 진행하도록 한다.

 

 

함수형 프로그래밍을 학문적 지식이 아닌 기술과 개념으로 보기

이 책은 실제 함수형 프로그래밍을 쓰고 있는 프로그래머가 가진 기술과 생각의 흐름, 시각을 정리했다. 동시에 학술적인 어려운 내용들을 제거했다. 그래서 함수형 프로그래밍을 하기 위해 당장 쓸 수 있는 기술과 개념을 배울 수 있다. 

 

함수형 프로그래밍에서 중요하다고 말하는 세 가지 기술인 액션(action)계산(calculation), 데이터(data) 를 구분하는 일에 대해 살펴보자.

 

 

액션과 계산, 데이터 구분하기

함수형 프로그래머는 직감적으로 코드를 세 분류로 구분한다.

 

1. 액션

2. 계산

3. 데이터

 

액션은 언제, 얼마만큼 호출하는지가 중요하기 때문에 부를 때 신중해야 한다. 중요한 메일을 보낼 떄 중복으로 보내지거나 보내지지 않는 상황을 바라는 사람은 아무도 없을 것이다.

 

 

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

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

 

반면 액션이 아닌 코드는 사용하기 쉽다.

호출하는 시점이 중요하지 않다. 언제 호출해도 항상 같은 값을 주기 때문이다. 

호출하는 횟수 역시 중요하지 않다. 나머지 코드나 소프트웨어 외부에 영향을 주지 않기 때문에 몇 번 호출이 되어도 상관이 없다. 

 

 

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

계산이나 데이터는 호출하는 시점과 횟수가 중요하지 않다. 

계산과 데이터의 차이는 실행 여부에 있는데, 계산은 실행 가능하나 데이터는 그렇지 않다.

데이터는 정적이고 눈에 보이는 그대로이다. 하지만 계산은 실행하기 전까지 어떻게 동작할 지 알 수 없다. 

때문에 가장 쓰기 좋은 것은 데이터이다.

 

따라서 함수형 프로그래머는 코드를 액션과 계산, 데이터로 구분한다. 

 

 

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

프로젝트 관리를 위해 클라우드 서비스를 개발한다고 가정한다. 

 

1. 사용자가 작업 완료 표시를 함 : 액션

2. 클라이언트가 서버로 메시지를 보냄 : 액션 (단, 메시지 자체는 데이터)

3. 서버가 메시지를 받음 : 액션

4. 서버가 데이터베이스를 받음 : 액션

5. 서버가 누구에게 알림을 보낼지 결정 : 계산

6. 서버가 이메일로 알림을 보냄 : 액션

 

 

함수형 프로그래머는 코드를 세 가지로 구분한다.

1. 액션

   - 실행 시점이나 횟수에 의존한다.

2. 계산

   - a 를 항상 b 로 만드는 과정이다. 

   - 항상 계산 결과는 같고 외부에 영향을 주지 않는다. 

3. 데이터

   - 이벤트에 대해 기록한 사실이다.

   - 같은 데이터를 여러 형태로 해석할 수 있다.

 

 

액션, 계산, 데이터를 구분하면 어떤 장점이 있는가 ? 

네트워크를 하는 복잡한 소프트웨어가 필요하게 된 상황에서 함수형 프로그래밍이 유용하다.

 

여러 컴퓨터가 네트워크를 통해 통신하기 시작하면 소프트웨어가 복잡해진다. 처리해야 할 메시지는 섞일 수 있고 중복되고 유실될 수 있다. 시간에 따라 바뀌는 값을 모델링할 때 동작 방법을 이해하는 것은 중요하나 쉽지 않다. 실행 시점이나 횟수에 의존하는 코드를 없애면 코드를 이해하기 쉽고, 오류 또한 막을 수 있다. 

 

데이터와 계산은 실행 시점이나 횟수에 의존하지 않는다. 

그래서 코드를 데이터와 계산으로 바꾸면 분산 시스템에서 생기는 여러 문제들을 해결할 수 있다.

 

액션은 실행 순서와 횟수에 의존하기 때문에 문제가 되지만, 코드에 영향을 주지 못하도록 격리하면 된다.

또 액션을 안전하게 다룰 수 있는 기술이 있기 때문에 괜찮다. 그리고 코드에서 액션을 계산으로 바꾸면 결과적으로 액션도 다루기 쉬워진다.

 

 

함수형 사고가 무엇인가 ?

함수형 프로그래밍에서 가장 중요한 사고 두 가지는 다음과 같다.

 

1. 액션과 계산, 데이터를 구분하는 일

2. 일급 추상(first-class abstration)

 

이 두 가지는 함수형 프로그래밍으로 실용적이고 튼튼한 프로그램을 만드는데 기초가 된다.

 

 

출처 : 쏙쏙 들어오는 함수형 코딩(Grokking Simplicity: Taming complex software with functional thinking)