해당 포스트는
쏙쏙 들어오는 함수형 코딩
을 학습하며 필요한 내용을 정리한 포스트입니다.
🌈 쏙쏙 들어오는 함수형 코딩에 오신것을 환영합니다.
이번 장에서 살펴볼 내용
- 함수형 사고가 무엇인지
- 다른 함수형 프로그래밍 책과 어떻게 다른지
- 함수형 프로그래머가 코드를 바라보는 특별한 방법
- 이 책을 계속 볼지 말지
💻 함수형 프로그래밍은 무엇인가요?
🍳 함수형 프로그래밍?
함수형 프로그래밍이 어디에 적합한지 콕 집어 말하기는 어렵지만, 함수형 프로그래밍은 범용 프로그래밍 패러다임이기 때문에 어디서나 잘 쓸 수 있다.
위키피디아 에서 정의한 함수형 프로그래밍의 뜻은,
수학함수를 사용하고 부수효과(side effect)를 피하는 것이 특징인 프로그래밍 패러다임
부수효과 없이 순수함수(pure function)만 사용하는 프로그래밍 스타일
이라고 설명하고 있다.
🍳 부수효과 (side effect)
이 책에서는 부수효과를 함수가 리턴값 이외에 하는 모든 일
이라고 정의한다.
부작용 정도로 알고 있었던 side effect, 그 외에도 원래의 목적과 다르게 다른 효과를 내는 것도 side effect라고 한다.
부수효과는 함수를 부를 때마다 발생하기 때문에 리턴값이 필요해서 부른 함수가 의도하지 않는 부수 효과를 발생시킬 수도 있다.
🍳 순수함수 (pure function)
이 책에서는 순수함수를 인자에만 의존하고 부수 효과가 없는 함수
라고 정의한다.
쉽게 말하자면 같은 인자를 넣으면 항상 같은 결과를 돌려주는 함수
를 말한다.
이러한 면 때문에 순수함수를 수학 함수라고 보기도 한다.
정리하자면 부수효과를 피하면서 결과를 인자에만 의존하는 순수함수를 사용하는 프로그래밍을 함수형 프로그래밍이라고 한다.
💻 실용적인 측면에서 함수형 프로그래밍 정의의 문제점
부수효과를 피하고 순수함수를 사용하라는 함수형 프로그래밍의 이론적 정의는 개발자에게 도움이 되지 않는다.
이 책에서는 함수형 프로그래밍을 실용적인 측면에서 바라보며 정의를 지적한다.
- 부수 효과는 필요하다.
- 이메일을 전송하지 않는 이메일 전송 소프트웨어
- 함수형 프로그래밍으로 부수 효과를 잘 다룰 수 있다.
- 순수 함수만 쓰라는 것처럼 되어 있지만, 함수형 프로그래머는 순수하지 않은 함수도 사용한다.
- 순수하지 않은 함수를 잘 다룰 수 있는 기술이 많이 있다.
- 함수형 프로그래밍은 실용적이다.
💻 액션과 계산, 데이터 구분하기
코드를 세 분류로 나눈다.
- 액션
- 계산
- 데이터
아래는 예시에서 별(*)표시가 있는 코드를 주의해서 보자
별 표시가 있는 함수는 언제, 얼마만큼 호출하는지가 중요하기 때문에 신중하게 호출해야 한다.
별 표시가 있는 코드들을 액션
이라고 부른다. 나머지 코드와 구분 해보자
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.