액션은 실행할 때마다 항상 같은 결과가 나옴이 보장되지 않는 동작입니다. 함수형 프로그래밍에서 액션과 계산을 분리하는 건 중요합니다. 왜냐하면 계산은 테스트하기 쉽고, 기계적인 분석이 쉽고, 조합하기 좋기 때문입니다. 계산은 함수형 프로그래밍에서 전문적인 용어로 순수 함수 또는 수학 함수라고 불리기도 합니다.
액션에서 계산을 분리하는 방법은 다음과 같습니다.
- 서브루틴 추출하기
- 암묵적 입력과 출력 찾기
- 암묵적 입력은 인자로 암묵적 출력은 리턴값으로 바꾸기
암묵적 입력의 예는 다음과 같습니다.
1
2
3
4
5
6
7
8
let num1 = 1
let num2 = 1
let result = 0
function DoSomething() {
result = num1 + num2
callApi(result)
}
위 함수에서 서브루틴을 추출해봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
let num1 = 1
let num2 = 1
let result = 0
function DoSomething() {
addNumbers()
callApi(result)
}
function addNumbers() {
result = num1 + num2
}
addNumbers는 액션입니다. num1과 num2를 더한 결과를 result에 저장합니다. 하지만 num1과 num2는 전역변수입니다. 전역변수를 읽는 것은 암묵적 입력입니다.
위 코드를 다음과 같이 바꿀 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
let num1 = 1
let num2 = 1
let result = 0
function DoSomething() {
addNumbers()
callApi(result)
}
function addNumbers(num1, num2) {
result = num1 + num2
}
이렇게 하면 암묵적 입력을 없앨 수 있습니다. 그럼 다음으로 암묵적 출력을 없애봅시다. 암묵적 출력은 전역변수인 result를 바꾸는 부분입니다. addNumbers를 다음과 같이 바꿀 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
let num1 = 1
let num2 = 1
let result = 0
function DoSomething() {
result = addNumbers()
callApi(result)
}
function addNumbers(num1, num2) {
return num1 + num2
}
이렇게 하면 암묵적 출력을 없앨 수 있습니다. 우리는 액션이었던 addNumbers를 계산으로 만들었습니다.
정리
이처럼 액션에서 계산을 분리하는 것은 함수형 프로그래밍에서 기본적인 개념 중 하나입니다. 함수형 프로그래밍에서는 코드의 가독성과 유지보수성을 높이기 위해 부수 효과(side effect)를 최소화하고, 불변성(Immutability)을 유지하는 것이 중요합니다. 액션에서 계산을 분리하는 것은 이러한 개념을 적용하기 위한 한 가지 방법입니다.
함수형 프로그래밍에서는 순수 함수(Pure Function)를 사용하여 부수 효과를 최소화하고, 불변성을 유지합니다. 불변성을 유지함으로써 코드의 안정성과 가독성이 높아지며, 디버깅이나 유지보수가 용이해집니다.