쏙쏙 들어오는 함수형 코딩 - CHAPTER 1.
포스트
취소

쏙쏙 들어오는 함수형 코딩 - CHAPTER 1.

쏙쏙 들어오는 함수형 코딩

해당 포스트는 쏙쏙 들어오는 함수형 코딩을 학습하며 필요한 내용을 정리한 포스트입니다.




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

이번 장에서 살펴볼 내용

  • 함수형 사고가 무엇인지
  • 다른 함수형 프로그래밍 책과 어떻게 다른지
  • 함수형 프로그래머가 코드를 바라보는 특별한 방법
  • 이 책을 계속 볼지 말지

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

🍳 함수형 프로그래밍?

함수형 프로그래밍이 어디에 적합한지 콕 집어 말하기는 어렵지만, 함수형 프로그래밍은 범용 프로그래밍 패러다임이기 때문에 어디서나 잘 쓸 수 있다.

위키피디아 에서 정의한 함수형 프로그래밍의 뜻은,

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

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

이라고 설명하고 있다.


🍳 부수효과 (side effect)

이 책에서는 부수효과를 함수가 리턴값 이외에 하는 모든 일이라고 정의한다.

부작용 정도로 알고 있었던 side effect, 그 외에도 원래의 목적과 다르게 다른 효과를 내는 것도 side effect라고 한다.

부수효과는 함수를 부를 때마다 발생하기 때문에 리턴값이 필요해서 부른 함수가 의도하지 않는 부수 효과를 발생시킬 수도 있다.


🍳 순수함수 (pure function)

이 책에서는 순수함수를 인자에만 의존하고 부수 효과가 없는 함수라고 정의한다.

쉽게 말하자면 같은 인자를 넣으면 항상 같은 결과를 돌려주는 함수를 말한다.

이러한 면 때문에 순수함수를 수학 함수라고 보기도 한다.

정리하자면 부수효과를 피하면서 결과를 인자에만 의존하는 순수함수를 사용하는 프로그래밍을 함수형 프로그래밍이라고 한다.




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

부수효과를 피하고 순수함수를 사용하라는 함수형 프로그래밍의 이론적 정의는 개발자에게 도움이 되지 않는다.

이 책에서는 함수형 프로그래밍을 실용적인 측면에서 바라보며 정의를 지적한다.

  • 부수 효과는 필요하다.
    • 이메일을 전송하지 않는 이메일 전송 소프트웨어
  • 함수형 프로그래밍으로 부수 효과를 잘 다룰 수 있다.
    • 순수 함수만 쓰라는 것처럼 되어 있지만, 함수형 프로그래머는 순수하지 않은 함수도 사용한다.
    • 순수하지 않은 함수를 잘 다룰 수 있는 기술이 많이 있다.
  • 함수형 프로그래밍은 실용적이다.




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

코드를 세 분류로 나눈다.

  1. 액션
  2. 계산
  3. 데이터

아래는 예시에서 별(*)표시가 있는 코드를 주의해서 보자

별 표시가 있는 함수는 언제, 얼마만큼 호출하는지가 중요하기 때문에 신중하게 호출해야 한다.

별 표시가 있는 코드들을 액션이라고 부른다. 나머지 코드와 구분 해보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "firstName":"koby",
  "lastName":"lee"
} 
// 사람에 대한 정보

* sendEmail(to, from, subject, body) 
// 이 함수는 이메일을 보내는 코드, 사용할 때 조심해야 함

sum(numbers) 
// 모든 숫자를 더하는 함수 

* saveUserDB(User) 
// 데이터베이스에 저장하면 다른 시스템에서 저장한 데이터를 볼 수 있음 

string_length(str)
// 같은 문자열을 넣으면 항상 같은 길이를 반환

* getCurrentTime()
// 호출할 때마다 다른 시간을 반환

[1, 10, 2 , 35, 3, 100]
// 단순한 숫자 리스트 




💻 부를 때 조심해야 하는 코드를 구분합니다.

위 예시에서 호출하는 횟수나 호출하는 시점이 중요한 함수가 중요한 경우를 분류해보면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
* sendEmail(to, from, subject, body) 
// 이 함수는 이메일을 보내는 코드, 사용할 때 조심해야 함

* saveUserDB(User) 
// 데이터베이스에 저장하면 다른 시스템에서 저장한 데이터를 볼 수 있음 

* getCurrentTime()
// 호출할 때마다 다른 시간을 반환

===========================================

{
  "firstName":"koby",
  "lastName":"lee"
} 
// 사람에 대한 정보

sum(numbers) 
// 모든 숫자를 더하는 함수 

string_length(str)
// 같은 문자열을 넣으면 항상 같은 길이를 반환

[1, 10, 2 , 35, 3, 100]
// 단순한 숫자 리스트 

액션(선 위쪽의 코드)은 호출하는 시점과 횟수에 의존한다. 그렇기 때문에 호출할 떄 조심해야 한다.




💻 실행하는 코드와 그렇지 않은 코드를 구분합니다.

호출 가능 여부를 기준으로 코드를 나둘 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 액션은 부르는 시점에 의존

* sendEmail(to, from, subject, body) 
// 이 함수는 이메일을 보내는 코드, 사용할 때 조심해야 함

* saveUserDB(User) 
// 데이터베이스에 저장하면 다른 시스템에서 저장한 데이터를 볼 수 있음 

* getCurrentTime()
// 호출할 때마다 다른 시간을 반환

===========================================

# 계산은 입력된 값을 계산해 출력하는 

sum(numbers) 

string_length(str)
// 같은 문자열을 넣으면 항상 같은 길이를 반환
// 모든 숫자를 더하는 함수 

===========================================

# 데이터는 이벤트에 대한 사실을 기록한 

{
  "firstName":"koby",
  "lastName":"lee"
} 
// 사람에 대한 정보

[1, 10, 2 , 35, 3, 100]
// 단순한 숫자 리스트 

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

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

액션과 계산, 데이터를 구분하는 것은 함수형 프로그래밍의 기본 개념




💻 액션과 계산, 데이터를 구분합니다.

액션과 계산, 데이터를 구분하는 예시 시나리오

1) 사용자가 작업 완료를 표시함

  • UI 이벤트인데 실행 횟수에 의존하기 때문에 액션

2) 클라이언트가 서버로 메세지를 보냄

  • 메세지를 보내는 것도 액션
  • 메세지 자체는 서버에서 해석해야 하는 값이기 때문에 데이터

3) 서버가 메세지를 받음

  • 메세지를 받는 것은 횟수에 의존하므로 액션

4) 서버가 데이터베이스를 변경

  • 내부 상태를 바꾸는 것은 액션

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

  • 결정하는 것은 계산

6) 서버가 이메일로 알림을 보냄

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

구분한 방법이 잘 이해되지 않아도 괜찮다.




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

🍳 액션

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

긴급한 메일을 오늘 보내는 것과 다음 주에 보내는 것은 완전히 다르며 같은 메일을 10번 보내는 것과 한 번 보내는 것 또는 보내지 않는 것도 다르다.

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


🍳 계산

입력값으로 출력값을 만드는 것

같은 입력을 가지고 계산하면 항상 같은 결괏값이 나온다.

언제, 어디서 계산해도 결과는 같고 외부에 영향을 주지 않는다.

테스트 하기가 용이하며 언제든지 몇 번을 호출해도 안전하다.

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


🍳 데이터

이벤트에 대해 기록한 사실

실행하는 코드만큼 복잡하지 않기 떄문에 다른 것과 구분된다.

알아보기 쉬운 속성으로 되어 있고 실행하지 않아도 데이터 자체로 의미가 있다.

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

예를 들어 영수증 데이터가 있을 때 관리자는 이 데이터를 가지고 판매량 분석 등을 할 수 있고, 고객은 지출 내역 등을 알아보기 위해 쓸 수 있다.

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




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

이 책에서 함수형 사고란, 함수형 프로그래머가 소프트웨어 문제를 해결하기 위해 사용하는 기술과 생각 이라고 말하며 함수형 사고의 두 가지 기술을 소개한다.

첫 번째는 코드를 액션(action), 계산(calculation), 데이터(data)로 구분하는 것이고, 두 번째는 일급 추상(first-class abstraction)이라는 개념이다.

🍳 액션

실행 시점이나 횟수 또는 둘 다에 의존한다.

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

getCurrentTime() sendEmail(to, from, subject, body) 등등 …


🍳 계산

입력값으로 출력값을 만든다.

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

sum(numbers) string_length(str) 등등 …


🍳 데이터

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

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

[1, 2, 3, 4, 5] {firstname : "Eric", lastname : "Normand"} 등등…


🍳 일급 추상

함수에 함수를 넘겨 더 많은 함수를 재사용한다.

이 부분은 나중에 더 자세히 다룬다고 한다.




📚 레퍼런스

Normand, 김은민, and Normand, Eric. (쏙쏙 들어오는) 함수형 코딩 : 심플한 코드로 복잡한 소프트웨어 길들이기 / 에릭 노먼드 지음 ; 김은민 옮김 (2022). Print.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.