1년 전에 작성한 포스팅 중에 Lodash fp 사용하기. 포스팅을 작성한 내용이 있다. 함수형 프로그래밍에 대해서 언급을 했지만, 함수형 프로그래밍을 설명되지 않아 작성을 해본다.
뭐 겉핥기이니, 절차적 프로그래밍 vs 객체지향 프로그래밍 vs 함수형 프로그래밍 중에 뭐가 좋아요? 이 질문에 답변을 해본다면 절대 해당 프로그래밍 방식들은 비교대상이 아니다. 뭐 간단하게 C++로 구구단 출력을 작성한다고 생각해보자.
1. main 메서드에서 for문으로만 구구단을 절차적 프로그래밍으로 작성 할 수 있을 것이다.
2. GuguClass를 작성하여, 객체지향 프로그래밍으로 작성 할 수 있을 것이다.
3. C++11버전 부터 사용가능함 람다표현식으로 함수형 프로그래밍을 작성 할 수 있을 것이다.
위의 예제에서는 구구단만 노출 하면 되는 것이니, 1번이 제일 낫겠다 볼 수 있을 있지만, 객체지향 프로그래밍이 각광받았던 이유가 대형 서비스를 구축할 때 절차적 프로그래밍의 한계 때문에 각광 받았다.
하지만 생각해보라. Class로 쪼갤 뿐이지, Class 내부에서 복잡한 메서드를 작성하게 될 때, 결국 함수를 호출 할 것이니, 절차적 프로그래밍이다.
이 처럼 우리가 만들 서비스에 일부분은 절차적, 객체지향, 함수형 프로그래밍은 상황에 따라서 유용한 방식이 있을 뿐이다. 앞설이 길었으니, 함수형 프로그래밍을 소개해보자.
함수형 프로그래밍
일단 함수가 무엇일까? 프로그래밍 용어가 아닌 함수 말이다. 사실 당신은 중학교 수학 시간에 함수라는 단어를 들었다. 아래의 이미지를 보면 아! 할 것이다.
함수형 프로그래밍에서의 함수는 이 수학적 함수를 말하고 있다. 수학적 함수와 우리가 사용하는 함수의 차이는 수학적 함수에는 레퍼런스 참조가 없다는 점과 외부의 값에 의존하지 않는다. 뭐 더 수많은 차이가 있겠지만, 위키를 작성 중인 것은 아니니 그렇다. 라고 생각하자.
레퍼런스 참조가 없다?(불변성)
"레퍼런스 참조가 없다"라는 말로 적당히 설명 했지만 이건 불변성을 뜻한다. 이건 side-effect를 없앨 수 있는 좋은 방법이 된다.
간단하게 [1, 2, 3] 이 배열에 제곱을 한 값의 합과, 두배한 값의 합과 어떤값이 비교를 한다고 해보자. 함수가 이미 작성되어 있다면 아래와 같이 작성 할 수 있을 것이다.
const arr = [1, 2, 3]
const squareSum = sum(square(arr))
// 14
const doubleSum = sum(double(arr))
// 12
하지만 square 함수가 아래처럼 작성 되어 있다면 어떨까?
function square(arr) {
for(let i = 0; i < arr.length; i++) {
arr[i] = arr[i] * arr[i]
}
return arr
}
const arr = [1, 2, 3]
const squareSum = sum(square(arr))
// 14
const doubleSum = sum(double(arr))
// 28
위 처럼 doubleSum의 값이 squreSum보다 훨씬 커져 버리는 상황이 발생한다. 이런상황은 지양해야한다.
외부의 값에 의존하지 않는다. (순수함수)
순수함수가 무엇일까? 외부의 값을 변경 하지 않으면, 외부의 값을 참조하지 않는 것을 말한다. 물론, 외부의 값을 변경하지 않으니, 리턴은 항상 있어야겠지.... 일은 하는데 아무것도 안하는 함수는 상상하면 안된다.
외부의 값을 참조하지 않으니, 같은 값으로 호출하면, 항상 같은 값이 나와야 한다.
물론 아래와 같은 상황은 순수 함수가 아니니 참고하자.
function add(a) {
return a + Math.random()
}
const b = 1
function add(a) {
return a + b
}
Math.random도 외부의 값에 의존 하는 것이며, b가 아무리 상수라고 하더라도 add 함수만 보면 b의 정의는 외부에 있는 것이다.
함수형 프로그래밍은 매우 많은 부분에서 수학을 엄청 많이 참조한 것으로 보인다. 애초에 함수형 프로그래밍의 "함수"라는 글자 자체도 수학적 함수였으니까 말이다. 함수형프로그래밍을 배우다 보면 Java, C++에서 람다식을 볼 수 있을 것이다. 사실 이건 람다대수를 뜻하는 것이다. 1930년대 알론조 처치가 수학기초론을 연구하는 과정에서 람다 대수의 형식을 제안하였다고 한다.
뭐 그다지 함수형 프로그래밍을 공부하고자 수학책을 펼칠 필요는 없다. 그냥 그렇다는 거다...
댓글
댓글 쓰기