2022. 7. 28. 01:13ㆍ독서
<함수형 코딩> 책을 펴고 1장을 펴면 다음과 같은 챕터에 대한 설명을 볼 수 있다.
이 장에서는 함수형 사고가 무엇인지, 왜 함수형 사고가 더 좋은 소프트웨어를 만들려는 개발자에게 도움이 되는지 설명합니다.
1장을 읽으면 함수형 사고가 무엇인지 알 수 있어야하고, 함수형 사고가 왜 도움이 되는지 설명할 수 있어야한다.
함수형 사고를 알기 전에 먼저 함수형 프로그래밍이란 무엇일까?
🧐 함수형 프로그래밍이란?
함수형 프로그래밍에 대해서 위키피디아를 찾으면 다음과 같이 2가지를 언급하고 있다.
1. 수학 함수를 사용하고 부수 효과를 피하는 것이 특징인 프로그래밍 패러다임.
2. 부수 효과 없이 순수 함수만 사용하는 프로그래밍 스타일
위 2문장을 읽고 수학 함수는 무엇이고 부수 효과는 무엇이며, 순수 함수는 무엇인지가 궁금해졌다.
먼저 부수 효과는 "함수가 리턴값 이외에 하는 모든 일을 말한다."라고 책에 명시되어 있다.
예시를 들어보자면 값을 2배로 증가시켜 증가시킨 값을 리턴받는 함수가 있다.
int getDoubled(int para) {
int doulbed = para * 2;
cout << "doubled value is " << doubled << "\n";
return doubled;
}
이때 cout 문장과 변수 doubled에 할당하는 행동이 모두 부수 효과라고 할 수 있다.
그럼 우리는 한가지 의문이 생긴다.
정말 함수가 부수효과가 없이 순수 계산 로직 만으로 구성될 수 있는가?
메일 전송이나, 회원 등록 함수는 무엇이란 말인가? 이는 함수형으로 처리 될 수 없는것인가?
이 의문을 안고 그 다음으로 넘어가자.
순수 함수는 "인자에만 의존하고 부수 효과가 없는 함수이다."라고 명시되어 있다.
수학함수와 같은, y = x^2, y = x^2 + 2 와 같은 것이라 생각하면 된다.
그럼 우리는 여기서 의문을 가지게 된다.
부수 효과 없이, 순수 함수로만 프로그래밍을 하는 것이 가능한 것인가?
🧐 사전적 정의의 문제점
책에서는 다음과 같이 그 문제점을 정의하고 있다.
- 부수 효과는 필요하다.
- 함수형 프로그래밍은 부수 효과를 잘 다룰 수 있다.
- 함수형 프로그래밍은 실용적이다.
부수 효과는 필요하다. 이메일을 전송하는 함수인데 이메일 전송이 부수효과라고 실행하지 않으면
그 애플리케이션의 존재가 무슨 소용이란 말인가?
나머지 두가지 문제에 대해서는 책에서 점점 다룰 예정이다.
🧐 액션, 계산, 데이터
함수형 프로그래밍에서 코드를 분류하는 가장 중요한 3가지 기준이다.
액션은 무엇일까?
액션은 결과가 부르는 시점, 횟수에 의존하고 있는 것을 말한다.
가장 간단한 예시로 getCurrentTime()과 같은 함수를 예로 들 수 있다.
계산은 입력값을 계산해 출력하는 것이다.
같은 입력값을 가지고 계산하면 항상 같은 결괏값이 나와야하고, 언제, 어디서 계산해도 결과는 같아야하며 외부에 영향을 주지도 않는다.
sum()과 같은 함수가 있을 것이다.
데이터는 이벤트에 대해 기록한 사실이다.
배열, 딕셔너리 등 자료구조나 DB 등이 해당될 것이다.
우리는 왜 코드를 액션, 계산, 데이터로 구분해야 할까?
이는 역설적이게도 함수형 프로그래밍의 장점으로 설명이 가능하다.
바로 시스템 의존성을 개선하기 위함이다.
시스템에 의존적인 경우를 생각해보자.
분산 시스템의 경우 처리해야할 메시지의 순서가 섞일 수도, 중복될 수도, 유실될 수도 있다.
이때 우리는 실행 시점이나 횟수에 의존하는 코드를 없애면, 코드를 더 수비게 이해할 수 있고, 심각한 버그를 막을 수 있다.
그렇기 때문에 우리는 코드를 액션, 계산, 데이터로 구분하는 것이다.
🧐 그래서 함수형 사고는?
함수형 사고란 함수형 프로그래머가 소프트웨어 문제를 해결하기 위해 사용하는 기술과 생각을 말한다.
크게 두 가지로 나눌 수 있다.
1. 액션과 계산, 데이터를 구분해서 생각하는 것.
2. 일급 추상.
일급 추상에 대해서는 간단하게 설명하자면 함수에 함수를 넘겨, 함수를 재사용 하는 것이다.
이에 대해서는 책에서 추가적인 언급이 있으리라 생각된다.
'독서' 카테고리의 다른 글
(Effective Java) 빌더 패턴(Builder) + Lombok Builder (1) | 2022.09.20 |
---|---|
(Effective Java) 생성자 대신 정적 팩터리 메서드를 고려하라 (2) | 2022.09.19 |
<실용주의 프로그래머> 서평 (0) | 2022.05.11 |
프로그래머의 뇌 서평 (0) | 2022.03.30 |
(클린코드) 2장. 의미 있는 이름 (0) | 2022.03.04 |