본문으로 건너뛰기

01 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다

이번 장에서 살펴볼 내용
  • 함수형 사고가 무엇인지 설명합니다.
  • 다른 함수형 프로그래밍 책과 어떻게 다른지 알 수 있습니다.
  • 함수형 프로그래머가 코드를 바라보는 특별한 방법을 알게 됩니다.
  • 여러분이 이 책을 계속 볼지 말지 감을 잡을 수 있습니다.

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

함수형 프로그래밍
  1. __수학 함수__를 사용하고 __부수 효과__를 피하는 것이 특징인 프로그래밍 패러다임
  2. 부수 효과 없이 __순수 함수__만 사용하는 프로그래밍 스타일

부수 효과는 함수가 리턴값 이외에 하는 모든 일을 말합니다. 예를 들어 메일 보내기나 전역 상태 수정하기 같은 일이 부수 효과입니다.

순수 함수는 인자에만 의존하고 부수 효과가 없는 함수입니다. 인자에만 의존한다는 말은 같은 인자를 넣으면 항상 같은 결과를 돌려준다는 말입니다.

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

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

윗 정의는 실용적인 측면에서 세 가지 문제가 있습니다.

문제 1: 부수 효과는 필요합니다.

정의에 따르면 함수형 프로그래밍은 부수 효과를 피해야 하지만, 부수 효과는 소프트웨어를 실행하는 이유입니다. 부수 효과는 필요할 떄는 써야 합니다.

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

함수형 프로그래머는 부수 효과가 필요하지만 문제가 될 수 있다는 것을 알기 때문에 부수 효과를 잘 다루기 위한 도구를 많이 알고 있습니다.

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

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

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

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

  1. 액션 (sendEmail(to, from, subject, body), saveUserDB(user))
  2. 계산 (sum(numbers), string_length(str))
  3. 데이터 ({ "firstname": "Eric", "lastname": "Nomand"}, [1, 2, 3, 4, 5])

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

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

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

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

계산이나 데이터는 둘 다 부르는 시점이나 횟수가 중요하지 않습니다. 계산과 데이터의 차이는 실행 여부에 있는데, 계산은 실행 가능하나 데이터는 그렇지 않습니다.

데이터는 정적이지만 계산은 실행하기 전까지 어떻게 동작할지 알 수 없습니다.

함수형 프로그래머는 액션보다 계산을 좋아하고 계산보다 데이터를 좋아합니다.

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

간단한 시나리오를 통해 더 자세히 알아봅시다.

프로젝트 관리를 위해 클라우드 서비스를 만든다고 생각해 봅시다. 여러 클라이언트가 작업 완료 표시를 하면 서버에서 이메일을 총해 알려주는 서비스입니다.

1단계: 사용자가 작업 완료 표시를 함

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

2단계: 클라이언트가 서버로 메시지를 보냄

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

3단계: 서버가 메시지를 받음

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

4단계: 서버가 데이터베이스를 변경

내부 상태를 바꾸는 것은 액션입니다.

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

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

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

이베일 보내기는 **액션입니다. 같은 메일을 한 번 보내는 것과 두 번 보내는 것은 다릅니다.

함수형 프로그래밍에서는 코드를 세 가지로 분류합니다.

1. 액션

액션은 실행 시점이나 횟수 또는 둘 다에 의존합니다.

함수형 프로그래밍 도구

  • 시간이 지남에 따라 안전하게 상태를 바꿀 수 있는 방법
  • 순서를 보장하는 방법
  • 액션이 정확히 한 번만 실행되게 보장하는 방법

2. 계산

계산은 입력값으로 출력값을 만드는 것입니다. 같은 입력값을 가지고 계산하면 항상 같은 결괏값이 나옵니다. 계산은 테스트하기 쉽고 언제든지 몇 번을 불러오 안전합니다.

함수형 프로그래밍 도구

  • 정확성을 위한 정적 분석
  • 소프트웨어에서 쓸 수 있는 수학적 지식
  • 테스트 전략

3. 데이터

데이터는 이벤트에 대해 기록한 사실입니다. 데이터는 실행하는 코드만큼 복잡하지 않기 때문에 다른 것과 구분이 도비니다.

함수형 프로그래밍 도구

  • 효율적으로 접근하기 위해 데이터를 구성하는 방법
  • 데이터를 보관하기 위한 기술
  • 데이터를 이용해 중요한 것을 발견하는 원칙

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

함수형 프로그래밍은 요즘 유행하는 분산 시스템에 잘 어울립니다.

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

액션은 실행 시점과 횟수에 의존하기 때문에 여전히 문제가 되지만, 코드 전체에 영향을 주지 않도록 격리시키면 됩니다. 또 분산 시스템이 아무리 불확실성을 가지고 있다고 해도 액션을 안전하게 다룰 수 있기 때문에 안심할 수 있습니다. 그리고 코드의 많은 부분을 액션에서 계산으로 옮기면 결과적으로 액션도 다루기 쉬워집니다.

다른 함수형 프로그래밍 책과 다른 점

  • 이 책은 소프트웨어 엔지니어링 관점에서 실용적으로 썼습니다.
  • 실제 있을 법한 시나리오로 설명합니다.
  • 소프트웨어 설계를 중심으로 설명합니다.
  • 함수형 프로그래밍의 풍부함을 배울 수 있습니다.
  • 특정 함수형 프로그래밍 언어에 종속적이지 않습니다.

이 책은 함수형 프로그래밍을 자바스크립트로 설명합니다. 자바스크립트는 함수형 프로그래밍을 하기 좋은 언어는 아니지만 함수형 프로그래밍을 하기에 부족하기에 함수형 프로그래밍을 가르치기 좋은 언어입니다. 왜냐면 부족한 기능으로 인해 그 문제를 어떻게 해결할지 생각해봐야 하기 때문입니다.

함수형 사고가 무엇인가요?

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

파트 1: 액션과 걔산, 데이터

이러한 분류는 코드를 이해하고 테스트 및 재사용하는 것과 관련되어 있습니다. 앞에서 이렇게 코드를 나누는 것에 대해 조금 살펴봤습니다. 파트 1에서는 코드를 구분하는 방법, 액션을 계산으로 리팩터링하는 방법, 액션을 더 쉽게 다루는 방법을 소개합니다.

파트 2: 일급 추상

대부분의 프로그래머는 재사용을 위해 조금 더 일반적인 함수 이름을 짓기 위해 고민합니다. 함수형 프로그래머도 똑같지만 함수에 함수를 넘겨 더 많은 함수를 재사용합니다.

이 책을 읽는 규칙

  1. 특정 언어 기능에 의존하지 않아야 합니다.
  2. 실용적이라 바로 쓸 수 있어야 합니다.
  3. 여러분의 현재 가지고 있는 코드와 관계없이 쓸 수 있어야 합니다.

요점 정리

  • 이 책은 두 파트로 되어 있습니다. 각 파트는 액션과 계산, 데이터를 구분하는 것과 일급 추상을 사용하는 것을 다룹니다.
  • 함수형 프로그래머는 코드를 액션과 계산, 데이터로 나눠서 바라봅니다.
  • 액션은 시간에 의존합니다. 그래서 사용하기 가장 어렵습니다. 액션에서 시간에 의존하는 부분을 분리하면 좀 더 다루기 쉽습니다.
  • 계산은 시간에 의존적이지 않습니다. 다루기 쉽게 때문에 가능한 코드를 계산으로 바꾸는 것이 좋습니다.
  • 데이터는 정적이고 해석이 필요합니다. 데이터는 저장하거나 이해하기 쉽고 전송하기 편리합니다.