프로그래밍 검색 블로그

clojure 오버로딩 2 (defmulti / defmethod) 본문

clojure기초

clojure 오버로딩 2 (defmulti / defmethod)

코딩조무사 2017. 10. 29. 17:04

정확히는 오버로딩이 아니지만 

clojure에서는 dispatcher를 커스텀하여 타입별로 오버로딩할수 있게 한다 


런타임중에 class 함수로 동적으로 오버로딩 하기 때문에 null check도 할수 있다

1
2
3
4
5
6
7
8
9
10
(class String)
=> java.lang.Class
(class Integer)
=> java.lang.Class
(class nil)
=> nil
 
(def f 5)
(class 5)
=> java.lang.Long
cs



check가 사용할 함수의 이름이다

일단 defmulti를 통해 dispathcer를 선언해준다


1
(defmulti check class)
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
(defmethod check :default [a]
           (println "default"))
 
(defmethod check nil [a]
           (println "nil"))
 
(defmethod check String [a]
           (println "String"))
 
(defmethod check Number [a]
           (println "Number"))
 
(defmethod check Double [a]
           (println "Double"))
cs


그후 dispatcher의 구현이 되는 함수들을 등록해주면 된다 

여기서 :default는 매칭이 모두 실패하면 마지막으로 가는 값이다 



테스트

1
2
3
4
5
6
7
(check 3)
(check (cast String nil))
(check 2.0)
(check (float 7.0))
(check print)
(defn foo [] nil)
(println (class (cast String (foo))))
cs

출력

Number

nil

Double

Number

default

nil




dispathcer의 함수에 따라서 값에 대한 오버로딩도 가능해진다

[identity] 를 사용하면 피보나치를 함수 3개로 나눠서 정의하는것도 가능해진다  

1
2
3
4
5
6
7
8
(defmulti fibo identity)
 
(defmethod fibo 0 [_] 0)
(defmethod fibo 1 [_] 1)
(defmethod fibo :default [n]
           (+ (fibo (- n 1)) (fibo (- n 2))))
 
(print (fibo 10))
cs


'clojure기초' 카테고리의 다른 글

clojure promise  (0) 2017.11.04
clojure 스레드  (0) 2017.11.04
clojue fibonacci / lazy-seq  (0) 2017.10.29
clojue fibonacci / memoize  (0) 2017.10.29
clojure 오버로딩  (0) 2017.10.28
Comments