요즘에 프로그래밍 공부를 하다보면, 다시 수학 공부를 하는 기분이 드는 중이다. 이래서 프로그래머 되려면 수학이 중요하다고 한건가? 이 생각이 드는 수준이다.
운을 띄운김에 함수 합성에 대해서 잠깐 설명 하자면, 아래와 같은 것이다.
<<https://en.wikipedia.org/wiki/File:Example_for_a_composition_of_two_functions.svg>>
위의 그림은 고등학교 1학년 수학시간에 합성 함수를 공부를 하면서 본 적이 있을 것이다. 간단하게 위의 내용을 수학적 기호로 표현 하면, h(x) = (g ∘ f )(x) = g(f(x)) 이와 같이 표현이 된다. h는 f와 g의 합성함수라고 부른다.일단 간단하게 위의 함수를 코드로 작성을 해보자. 아주 간단하게 작성 하였다.
function f(x) {
if(x === 1) return 1
if(x === 2) return 3
if(x === 3) return 1
if(x === 4) return 2
}
function g(x) {
if(x === 1) return 2
if(x === 2) return 3
if(x === 3) return 1
if(x === 4) return 2
}
function h(x) {
if(x === 1) return 2
if(x === 2) return 1
if(x === 3) return 2
if(x === 4) return 3
}
g(f(1)) === h(1)
일단 이게 함수합성이다. 그러니 별거 아니다.
함수 합성
뭐 물론 위의 방법도 훌룡한 함수 합성이다. 수학적으로는 말이다. 코드에서는 저런 스타일은 꽤 좋지 않을 것이다.
생각을 넓혀 보면 콜백지옥도 함수 합성이라고 볼 수 있다. 또한 Promise 체인을 하고 있다면, 그것 또한 함수를 합성하고 있다고 볼 수 있다.
당연하게도 콜백 지옥 보다는 promise 체인을 하는 것이 좋다고 볼 수 있을 것이다.
위의 방식보다는 (g ∘ f )(x) 처럼 콜백 지옥도 아니고, 함수의 구성요소를 확인 할 수 있도록 만들어보자.
function pipe(...fns) {
return function(initValue) {
let value = initValue
for(const fn of fns) {
value = fn(value)
}
return value
}
}
pipe(g, f)(1)
간단하게 함수들을 합성해주는 함수를 만들어보았다. 이 부분은 좀 더 개선해야 하는 점이 있다. 이 부분에 대해서는 다음 번에 알아보도록 하자.
댓글
댓글 쓰기