User Tools

Site Tools


tips:clojure:apply_reduce_함수의_차이

apply/reduce 함수의 차이


프로그램을 짜다 보면, 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) 식으로 실행되므로 에러가 발생한다.

이에 반해, + 함수는 (+ 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) 식으로 실행되므로, 에러가 발생하지 않는다.

최종 결론은, '2개 이상의 인수를 받아들이는' 함수를 호출 하는 경우에는 apply 함수를 사용할 수 있지만, '2개의 인수만을 받아들이는' 함수를 호출하는 경우에는 reduce 함수를 사용하라는 것이다.

tips/clojure/apply_reduce_함수의_차이.txt · Last modified: 2019/02/04 14:26 (external edit)