프로그램을 짜다 보면, apply와 reduce 함수를 언제 사용해야 할지 잘 판단이 서지 않는 경우가 종종 있다. 그래서 여기서는 그 차이점을 알아보도록 하겠다.
예를 들어, 아래의 코드를 보면, apply와 reduce 함수가 동일한 결과값을 반환하고 있다.
(apply + [1 2 3 4 5]) ;=> 15 (reduce + [1 2 3 4 5]) ;=> 15
그렇다면 apply와 reduce 함수의 차이는 무엇인가? 그 차이를 알아보기 위해 먼저 my-add라는 함수를 다음과 같이 정의하고 테스트를 진행해 보자.
(defn my-add [a b] (+ a b)) (apply my-add [1 2 3 4 5]) ;-> clojure.lang.ArityException: Wrong number of args (reduce my-add [1 2 3 4 5]) ;=> 15
apply 함수의 경우에만 ArrityException이 발생했다. 그 이유는 my-add 함수가 정확히 2개의 인수만을 받아들이도록 정의되어 있기 때문이다. 다시 말해, (apply my-add [1 2 3 4 5]) 로 호출하면, (my-add 1 2 3 4 5) 식으로 실행되므로 에러가 발생한다.
(apply my-add [1 2 3 4 5])
(my-add 1 2 3 4 5)
이에 반해, + 함수는 (+ x y & more) 식으로 정의되어 있다. 다시 말해, + 함수는 원래 다인수 함수로 정의되어 있어서, (apply + [1 2 3 4 5]) 식으로 호출하면 (+ 1 2 3 4 5) 식으로 실행되므로, 결과적으로 에러가 발생하지 않는다.
(+ x y & more)
(apply + [1 2 3 4 5])
(+ 1 2 3 4 5)
반면에, (reduce my-add [1 2 3 4 5]) 는 (my-add (my-add (my-add (my-add 1 2) 3) 4) 5) 식으로 실행되므로, 에러가 발생하지 않는다.
(reduce my-add [1 2 3 4 5])
(my-add (my-add (my-add (my-add 1 2) 3) 4) 5)
최종 결론은, '2개 이상의 인수를 받아들이는' 함수를 호출 하는 경우에는 apply 함수를 사용할 수 있지만, '2개의 인수만을 받아들이는' 함수를 호출하는 경우에는 reduce 함수를 사용하라는 것이다.