SlideShare a Scribd company logo
1 of 45
Programming Clojure
8 장 . 다중 메서드
아키텍쳐를 꿈꾸는 사람들 (café.naver.com/architect1)
김광중 (visualwizard@gmail.com)
목차
1. 다중 메서드 없이 산다는 것 .
2. 다중 메서드 정의하기
3. 다형성을 넘어서
4. 자유로운 메서드 선택
5. 언제 다중 메서드를 사용해야 할까
8. 다중 메서드
Clojure 의 다중 메서드가 무엇인
지 ??
함수가 여러 형태의 인자를 입
력으로 받을 수 있게 하는 것 .
여러 형태의 인자 = 인자의 타입이 다
양 .!
8. 다중 메서드
다른 언어 에도 여러 형태의 인자
를 받는 것이 있다 .
void TestFunc(int i){…}
void TestFunc(char a) {…}
void TestFunc(int i, int j) {…}
TestFunc(1);
TestFunc(10, 20);
TestFunc('b');
C++ 의 함수 오버로딩 (overloading)
8. 다중 메서드
다른 언어 에도 여러 형태의 인자
를 받는 것이 있다 .
void TestFunc(int i){…}
void TestFunc(char a) {…}
void TestFunc(int i, int j) {…}
TestFunc(1);
TestFunc(10, 20);
TestFunc('b');
인자의 타입에 따라 다르게 처
리 .!
8. 다중 메서드
Clojure 는 프로그래머가 지정한 함수
를
다중 메서드의 인자에 적용한 결과
에 따라 실행할 구현을 선택한다 .
8. 다중 메서드
사실상 그렇게 많이 사용되고 있지
는 않다 .
없으면 불편한 것이 사실 .!
8. 다중 메서드
다중 메서드가 없다면… ??
8.1 다중 메서드 없이 산 다는 것 .
입력 받은 문자열을 출력하는
함수 제작 .
(defn my-print [ob]
(.write *out* ob)
)
(defn my-println
[ob]
(my-print ob)
(.write *out*
"n")
)
=> 문자열을 출력하자 .
=> 문자열 출력 후 ,
=> 줄바꿈을 하자 .
8.1 다중 메서드 없이 산 다는 것 .
입력 받은 문자열과 nil 을 출력하
는
함수 제작 .
(defn my-print [ob]
(cond
(nil? ob) (.write *out* "nil" )
(string? ob) (.write *out* ob)
)
)
8.1 다중 메서드 없이 산 다는 것 .
인자의 타입이 벡터라도 동작하게
하자 .!
(use '[clojure.contrib.str-utils :only
(str-join)])
(defn my-print-vector [ob]
(.write *out*"[")
(.write *out* (str-join " " ob))
(.write *out* "]"))
8.1 다중 메서드 없이 산 다는 것 .
인자의 타입이 벡터라도 동작하게
하자 .!
(defn my-print [ob]
(cond
(vector? ob) (my-print-vector ob)
(nil? ob) (.write *out* "nil")
(string? ob) (.write *out* ob)
)
)
8.1 다중 메서드 없이 산 다는 것 .
8.1 다중 메서드 없이 산 다는 것 .
또 다른 타입을 지원하려면 ..!
(defn my-print [ob]
(cond
(vector? ob) (my-print-
vector ob)
(nil? ob) (.write *out*
"nil")
(string? ob) (.write *out*
ob)
(TYPE? Ob) ( my-print-TYPE
ob)
…
…
새 타입을 다룰 보조 함수
my-print-TYPE 을 만든다 .
my-print 안에서 보조 함수를
호출한다 .
8.1 다중 메서드 없이 산다는 것
.
다중 메서드가 없다면… ??
새 타입을 다룰 보조 함수를 만든다 .
my-print 안에서 보조 함수를 호출한다
.
8.2 다중 메서드 정의하기
기존의 코드는 수정하지 않고 , 새
로운 TYPE 에 대한 코드만 추가 하
자 .!
다중 메서드를 이용하자 .
( defmulti name dispatch-fn )
8.2 다중 메서드 정의하기
( defmulti name dispatch-
fn )
인자에 적용할 함수메서드 이름
8.2 다중 메서드 정의하기
( defmulti name
class)
클로저에서 제공하는 class 함수 이용
( class 함수는 자바의 getClass 함수의 래퍼
8.2 다중 메서드 정의하기
( defmulti name
TYPE )
class
“foo” nil
8.2 다중 메서드 정의하기
( defmulti name
TYPE )
class
“foo” nil
TYPE 에 대한 처리 함수는 정의하지 않았다 .!!!
8.2 다중 메서드 정의하기
TYPE 에 대한 처리 함수는 정의하지 않았다 .!!!
TYPE 에 대한 처리 함수를 정의하자 .!!
( defmethod name dispatch-val & fn-tail )
8.2 다중 메서드 정의하기
( defmethod name dispatch-val & param )
( defmulti name dispatch-fn )
dispatch-fn 을 수행한 결과 값
8.2 다중 메서드 정의하기
(defmulti my-print class)
(defmethod my-print String [s]
(.write *out* s)
)
my-print 메서드는 이제 String
타입을 지원하게 되었다 .!
8.2 다중 메서드 정의하기
8.2 다중 메서드 정의하기
(defmethod my-print nil [s]
(.write *out* “this is nil”)
)
my-print 메서드는 이제 nil 타입
을 지원하게 되었다 .!
8.2 다중 메서드 정의하기
8.2 다중 메서드 정의하기
기존의 my-print 를 수정하지 않
고 ,
타입에 맞는 메서드만 추가하여 구현
8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고
려한다 )
다중 메서드 (my-print) 가 , 수행할
메서드를 선택할 때는 자바의 상속 관
계를 고려한다
(defmulti my-print class)
(defmethod my-print Number [n]
(.write *out* (.toString n) )
)
42(Integer)
1.2(Float)
8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고
려한다 )
다중 메서드 (my-print) 가 , 수행할
메서드를 선택할 때는 자바의 상속 관
계를 고려한다
(defmulti my-print class)
(defmethod my-print Number [n]
(.write *out* (.toString n) )
)
42(Integer)
1.2(Float)
내부적으로 isa? 함수가 사용되어 판단함 .
8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고
려한다 )
8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 )
( defmethod name dispatch-val & param )
( defmulti name dispatch-fn )
dispatch-fn 을 수행한 결과 값이
dispatch-val 에 해당하는 값이 없을 때 .
8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 )
:default 사용 .
(defmulti my-print class)
(defmethod my-print :default [s]
(.write *out* "#<")
(.write *out* (.toString s))
(.write *out* ">")
)
8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 )
(defmulti name dispatch-fn :default default-value )
(defmulti my-print class :default
:everything-else)
(defmethod my-print String [s]
(.write *out* s))
(defmethod my-print :everything-else [_]
(.write *out* "Not implemented yet..."))
8.3 다형성을 넘어서
벡터를 더 좋게 표현하기 위해 defmethod 를 추가하다 보니 ..
(use '[clojure.contrib.str-utils :only (str-join)])
(defmethod my-print java.util.Collection [c]
(.write *out* "(")
(.write *out* (str-join " " c))
(.write *out* ")"))
(defmethod my-print clojure.lang.IPersistentVector [c]
(.write *out* "[")
(.write *out* (str-join " " c))
(.write *out* "]")
)
8.3 다형성을 넘어서
(prefer-method multi-name loved-dispatch dissed-dispatch )
충돌이 생기는 경우 특정한 dispatch-fn 의 값이 다른
dispatch-fn 의 값 보다 우선이라고 선언하는 것 .
8.3 다형성을 넘어서
(prefer-method multi-name loved-dispatch dissed-dispatch )
충돌이 생기는 경우 특정한 dispatch-fn 의 값이 다른
dispatch-fn 의 값 보다 우선이라고 선언하는 것 .
(prefer-method my-print
clojure.lang.IPersistentVector
java.util.Collection )
8.4 자유로운 메서드 선택
타입에 따른 메서드의 수행이 아니라 , 임의의
기준에 의한 메서드 수행 .!
입력되는 값에 따라 적절한 메서드가 수행 .
8.4 자유로운 메서드 선택
입력되는 값에 따라 적절한 메서드가 수행 .
(ns examples.multimethods.account)
(defstruct account :id :tag :balance)
(alias 'acc 'examples.multimethods.account)
(def test-savings (struct account 1 ::acc/Savings
100M) )
(def test-checking (struct account 2 ::acc/Checking
250M) )
8.4 자유로운 메서드 선택
입력되는 값에 따라 적절한 메서드가 수행 .
(defmulti interest-rate :tag)
(defmethod interest-rate ::acc/Checking [_] 0M)
(defmethod interest-rate ::acc/Savings [_]
0.05M)
8.4 자유로운 메서드 선택
8.5 언제 다중 메서드를 사용해야 할까
많은 클로저 프로젝트들이 다중 메서드를 그리 많이
사용하고 있지는 않다 . 클로저 오픈소스 프로젝트에서 사용된
다중 메서드는 대략 1000 라인에 하나 정도…
대부분은 ‘클래스에 의한 메서드 선택’
8.5 언제 다중 메서드를 사용해야 할까
많은 클로저 프로젝트들이 다중 메서드를 그리 많이
사용하고 있지는 않다 . 클로저 오픈소스 프로젝트에서 사용된
다중 메서드는 대략 1000 라인에 하나 정도…
대부분은 ‘클래스에 의한 메서드 선택’
8.5 언제 다중 메서드를 사용해야 할까
그 외…
inspector 라이브러리 : 시스템 속성에 대한 트리 뷰를 얻음
타입 값 ( 키워드 ) 을 반환하는 함수 (collection-tag) 와
트리 조건을 검사하는 세 가지 다중 메서드로 트리 타입
시스템을 추가함
test-is 라이브러리 : is 매크로를 사용하여 assertion 구현
is 에 넘겨지는 표현식을 내부적으로 assert-expr 이라는
다중 메서드로 처리하여 dispatch-val 값을 반환한다 .
8. 장 요약
다중 메서드는 인자 값으로 , 결과를 반환하는 함수를
사용하겠다고 지정 하는 것 .
다중 메서드는 인자에 반환된 결과값을 처리하는 함수만
추가로 정의하면 된다 .
다중 메서드가 실제 수행을 할 때는 자바의 상속 관계를
알아서 고려한다 .
인자 값을 반환하는 함수의 리턴 값이 매치되는 것이 없을
경우를 처리하기 위해 디폴트 다중 메서드를 지원한다 .
반환 된 인자 값이 다형성을 가지고 있을 경우 , 이에 대한
처리법을 지원한다 .
타입 처리 뿐만 아니라 특정 값에 의한 메서드 실행도
가능하다 .
Q&A
Fin.
감사합니다 .

More Related Content

What's hot

Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinDong Chan Shin
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편Darion Kim
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차HyunJoon Park
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1연우 김
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어NAVER D2
 
비개발자를 위한 Javascript 알아가기 #6
비개발자를 위한 Javascript 알아가기 #6비개발자를 위한 Javascript 알아가기 #6
비개발자를 위한 Javascript 알아가기 #6민태 김
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터Dong Chan Shin
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6연우 김
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차HyunJoon Park
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swiftNAVER D2
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 CHeesuk Kang
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinDong Chan Shin
 
파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310Yong Joon Moon
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2Injae Lee
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409Yong Joon Moon
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Nam Hyeonuk
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기 Yong Joon Moon
 
Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3연우 김
 

What's hot (20)

Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편주니어 개발자도 이해 할 수 있는 Go - Scope 편
주니어 개발자도 이해 할 수 있는 Go - Scope 편
 
C++ Advanced 강의 2주차
C++ Advanced 강의 2주차C++ Advanced 강의 2주차
C++ Advanced 강의 2주차
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
 
비개발자를 위한 Javascript 알아가기 #6
비개발자를 위한 Javascript 알아가기 #6비개발자를 위한 Javascript 알아가기 #6
비개발자를 위한 Javascript 알아가기 #6
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
C++ Advanced 강의 1주차
C++ Advanced 강의 1주차C++ Advanced 강의 1주차
C++ Advanced 강의 1주차
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swift
 
학교에서 배우지 않는 C
학교에서 배우지 않는 C학교에서 배우지 않는 C
학교에서 배우지 않는 C
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
파이썬 함수 이해하기
파이썬 함수 이해하기 파이썬 함수 이해하기
파이썬 함수 이해하기
 
Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3Effective C++ 정리 chapter 3
Effective C++ 정리 chapter 3
 

Viewers also liked

Viewers also liked (7)

2014ISCAT
2014ISCAT2014ISCAT
2014ISCAT
 
Yiqing Wang, MBA
Yiqing Wang, MBAYiqing Wang, MBA
Yiqing Wang, MBA
 
Evaluacion exposicion nicole v (1)
Evaluacion exposicion nicole v (1)Evaluacion exposicion nicole v (1)
Evaluacion exposicion nicole v (1)
 
100 106-ecuaciones cuadraticas-una_incognita
100 106-ecuaciones cuadraticas-una_incognita100 106-ecuaciones cuadraticas-una_incognita
100 106-ecuaciones cuadraticas-una_incognita
 
Netiqueta
NetiquetaNetiqueta
Netiqueta
 
Mqtt 소개
Mqtt 소개Mqtt 소개
Mqtt 소개
 
¿Qué es la Ecología?
¿Qué es la Ecología?¿Qué es la Ecología?
¿Qué es la Ecología?
 

Similar to 8.다중메서드

5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스SeoYeong
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 releaseJaehyeuk Oh
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008daliot
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별Han-Byul Jeon
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타NAVER D2
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장SeongHyun Ahn
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
자바 8
자바 8자바 8
자바 8신 한
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션codercay
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7Chris Ohk
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3david nc
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong Chan Shin
 

Similar to 8.다중메서드 (20)

5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
Smalltalk at Altlang 2008
Smalltalk at Altlang 2008Smalltalk at Altlang 2008
Smalltalk at Altlang 2008
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
 
[A1]루비는 패셔니스타
[A1]루비는 패셔니스타[A1]루비는 패셔니스타
[A1]루비는 패셔니스타
 
6 function
6 function6 function
6 function
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
자바 8
자바 8자바 8
자바 8
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
Gpg gems1 1.3
Gpg gems1 1.3Gpg gems1 1.3
Gpg gems1 1.3
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
Linq
LinqLinq
Linq
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 

8.다중메서드

  • 1. Programming Clojure 8 장 . 다중 메서드 아키텍쳐를 꿈꾸는 사람들 (café.naver.com/architect1) 김광중 (visualwizard@gmail.com)
  • 2. 목차 1. 다중 메서드 없이 산다는 것 . 2. 다중 메서드 정의하기 3. 다형성을 넘어서 4. 자유로운 메서드 선택 5. 언제 다중 메서드를 사용해야 할까
  • 3. 8. 다중 메서드 Clojure 의 다중 메서드가 무엇인 지 ?? 함수가 여러 형태의 인자를 입 력으로 받을 수 있게 하는 것 . 여러 형태의 인자 = 인자의 타입이 다 양 .!
  • 4. 8. 다중 메서드 다른 언어 에도 여러 형태의 인자 를 받는 것이 있다 . void TestFunc(int i){…} void TestFunc(char a) {…} void TestFunc(int i, int j) {…} TestFunc(1); TestFunc(10, 20); TestFunc('b'); C++ 의 함수 오버로딩 (overloading)
  • 5. 8. 다중 메서드 다른 언어 에도 여러 형태의 인자 를 받는 것이 있다 . void TestFunc(int i){…} void TestFunc(char a) {…} void TestFunc(int i, int j) {…} TestFunc(1); TestFunc(10, 20); TestFunc('b'); 인자의 타입에 따라 다르게 처 리 .!
  • 6. 8. 다중 메서드 Clojure 는 프로그래머가 지정한 함수 를 다중 메서드의 인자에 적용한 결과 에 따라 실행할 구현을 선택한다 .
  • 7. 8. 다중 메서드 사실상 그렇게 많이 사용되고 있지 는 않다 . 없으면 불편한 것이 사실 .!
  • 8. 8. 다중 메서드 다중 메서드가 없다면… ??
  • 9. 8.1 다중 메서드 없이 산 다는 것 . 입력 받은 문자열을 출력하는 함수 제작 . (defn my-print [ob] (.write *out* ob) ) (defn my-println [ob] (my-print ob) (.write *out* "n") ) => 문자열을 출력하자 . => 문자열 출력 후 , => 줄바꿈을 하자 .
  • 10. 8.1 다중 메서드 없이 산 다는 것 . 입력 받은 문자열과 nil 을 출력하 는 함수 제작 . (defn my-print [ob] (cond (nil? ob) (.write *out* "nil" ) (string? ob) (.write *out* ob) ) )
  • 11. 8.1 다중 메서드 없이 산 다는 것 . 인자의 타입이 벡터라도 동작하게 하자 .! (use '[clojure.contrib.str-utils :only (str-join)]) (defn my-print-vector [ob] (.write *out*"[") (.write *out* (str-join " " ob)) (.write *out* "]"))
  • 12. 8.1 다중 메서드 없이 산 다는 것 . 인자의 타입이 벡터라도 동작하게 하자 .! (defn my-print [ob] (cond (vector? ob) (my-print-vector ob) (nil? ob) (.write *out* "nil") (string? ob) (.write *out* ob) ) )
  • 13. 8.1 다중 메서드 없이 산 다는 것 .
  • 14. 8.1 다중 메서드 없이 산 다는 것 . 또 다른 타입을 지원하려면 ..! (defn my-print [ob] (cond (vector? ob) (my-print- vector ob) (nil? ob) (.write *out* "nil") (string? ob) (.write *out* ob) (TYPE? Ob) ( my-print-TYPE ob) … … 새 타입을 다룰 보조 함수 my-print-TYPE 을 만든다 . my-print 안에서 보조 함수를 호출한다 .
  • 15. 8.1 다중 메서드 없이 산다는 것 . 다중 메서드가 없다면… ?? 새 타입을 다룰 보조 함수를 만든다 . my-print 안에서 보조 함수를 호출한다 .
  • 16. 8.2 다중 메서드 정의하기 기존의 코드는 수정하지 않고 , 새 로운 TYPE 에 대한 코드만 추가 하 자 .! 다중 메서드를 이용하자 . ( defmulti name dispatch-fn )
  • 17. 8.2 다중 메서드 정의하기 ( defmulti name dispatch- fn ) 인자에 적용할 함수메서드 이름
  • 18. 8.2 다중 메서드 정의하기 ( defmulti name class) 클로저에서 제공하는 class 함수 이용 ( class 함수는 자바의 getClass 함수의 래퍼
  • 19. 8.2 다중 메서드 정의하기 ( defmulti name TYPE ) class “foo” nil
  • 20. 8.2 다중 메서드 정의하기 ( defmulti name TYPE ) class “foo” nil TYPE 에 대한 처리 함수는 정의하지 않았다 .!!!
  • 21. 8.2 다중 메서드 정의하기 TYPE 에 대한 처리 함수는 정의하지 않았다 .!!! TYPE 에 대한 처리 함수를 정의하자 .!! ( defmethod name dispatch-val & fn-tail )
  • 22. 8.2 다중 메서드 정의하기 ( defmethod name dispatch-val & param ) ( defmulti name dispatch-fn ) dispatch-fn 을 수행한 결과 값
  • 23. 8.2 다중 메서드 정의하기 (defmulti my-print class) (defmethod my-print String [s] (.write *out* s) ) my-print 메서드는 이제 String 타입을 지원하게 되었다 .!
  • 24. 8.2 다중 메서드 정의하기
  • 25. 8.2 다중 메서드 정의하기 (defmethod my-print nil [s] (.write *out* “this is nil”) ) my-print 메서드는 이제 nil 타입 을 지원하게 되었다 .!
  • 26. 8.2 다중 메서드 정의하기
  • 27. 8.2 다중 메서드 정의하기 기존의 my-print 를 수정하지 않 고 , 타입에 맞는 메서드만 추가하여 구현
  • 28. 8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고 려한다 ) 다중 메서드 (my-print) 가 , 수행할 메서드를 선택할 때는 자바의 상속 관 계를 고려한다 (defmulti my-print class) (defmethod my-print Number [n] (.write *out* (.toString n) ) ) 42(Integer) 1.2(Float)
  • 29. 8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고 려한다 )
  • 30. 다중 메서드 (my-print) 가 , 수행할 메서드를 선택할 때는 자바의 상속 관 계를 고려한다 (defmulti my-print class) (defmethod my-print Number [n] (.write *out* (.toString n) ) ) 42(Integer) 1.2(Float) 내부적으로 isa? 함수가 사용되어 판단함 . 8.2 다중 메서드 정의하기 ( 메서드 선택은 상속을 고 려한다 )
  • 31. 8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 ) ( defmethod name dispatch-val & param ) ( defmulti name dispatch-fn ) dispatch-fn 을 수행한 결과 값이 dispatch-val 에 해당하는 값이 없을 때 .
  • 32. 8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 ) :default 사용 . (defmulti my-print class) (defmethod my-print :default [s] (.write *out* "#<") (.write *out* (.toString s)) (.write *out* ">") )
  • 33. 8.2 다중 메서드 정의하기 ( 디폴트 다중 메서드 ) (defmulti name dispatch-fn :default default-value ) (defmulti my-print class :default :everything-else) (defmethod my-print String [s] (.write *out* s)) (defmethod my-print :everything-else [_] (.write *out* "Not implemented yet..."))
  • 34. 8.3 다형성을 넘어서 벡터를 더 좋게 표현하기 위해 defmethod 를 추가하다 보니 .. (use '[clojure.contrib.str-utils :only (str-join)]) (defmethod my-print java.util.Collection [c] (.write *out* "(") (.write *out* (str-join " " c)) (.write *out* ")")) (defmethod my-print clojure.lang.IPersistentVector [c] (.write *out* "[") (.write *out* (str-join " " c)) (.write *out* "]") )
  • 35. 8.3 다형성을 넘어서 (prefer-method multi-name loved-dispatch dissed-dispatch ) 충돌이 생기는 경우 특정한 dispatch-fn 의 값이 다른 dispatch-fn 의 값 보다 우선이라고 선언하는 것 .
  • 36. 8.3 다형성을 넘어서 (prefer-method multi-name loved-dispatch dissed-dispatch ) 충돌이 생기는 경우 특정한 dispatch-fn 의 값이 다른 dispatch-fn 의 값 보다 우선이라고 선언하는 것 . (prefer-method my-print clojure.lang.IPersistentVector java.util.Collection )
  • 37. 8.4 자유로운 메서드 선택 타입에 따른 메서드의 수행이 아니라 , 임의의 기준에 의한 메서드 수행 .! 입력되는 값에 따라 적절한 메서드가 수행 .
  • 38. 8.4 자유로운 메서드 선택 입력되는 값에 따라 적절한 메서드가 수행 . (ns examples.multimethods.account) (defstruct account :id :tag :balance) (alias 'acc 'examples.multimethods.account) (def test-savings (struct account 1 ::acc/Savings 100M) ) (def test-checking (struct account 2 ::acc/Checking 250M) )
  • 39. 8.4 자유로운 메서드 선택 입력되는 값에 따라 적절한 메서드가 수행 . (defmulti interest-rate :tag) (defmethod interest-rate ::acc/Checking [_] 0M) (defmethod interest-rate ::acc/Savings [_] 0.05M)
  • 41. 8.5 언제 다중 메서드를 사용해야 할까 많은 클로저 프로젝트들이 다중 메서드를 그리 많이 사용하고 있지는 않다 . 클로저 오픈소스 프로젝트에서 사용된 다중 메서드는 대략 1000 라인에 하나 정도… 대부분은 ‘클래스에 의한 메서드 선택’
  • 42. 8.5 언제 다중 메서드를 사용해야 할까 많은 클로저 프로젝트들이 다중 메서드를 그리 많이 사용하고 있지는 않다 . 클로저 오픈소스 프로젝트에서 사용된 다중 메서드는 대략 1000 라인에 하나 정도… 대부분은 ‘클래스에 의한 메서드 선택’
  • 43. 8.5 언제 다중 메서드를 사용해야 할까 그 외… inspector 라이브러리 : 시스템 속성에 대한 트리 뷰를 얻음 타입 값 ( 키워드 ) 을 반환하는 함수 (collection-tag) 와 트리 조건을 검사하는 세 가지 다중 메서드로 트리 타입 시스템을 추가함 test-is 라이브러리 : is 매크로를 사용하여 assertion 구현 is 에 넘겨지는 표현식을 내부적으로 assert-expr 이라는 다중 메서드로 처리하여 dispatch-val 값을 반환한다 .
  • 44. 8. 장 요약 다중 메서드는 인자 값으로 , 결과를 반환하는 함수를 사용하겠다고 지정 하는 것 . 다중 메서드는 인자에 반환된 결과값을 처리하는 함수만 추가로 정의하면 된다 . 다중 메서드가 실제 수행을 할 때는 자바의 상속 관계를 알아서 고려한다 . 인자 값을 반환하는 함수의 리턴 값이 매치되는 것이 없을 경우를 처리하기 위해 디폴트 다중 메서드를 지원한다 . 반환 된 인자 값이 다형성을 가지고 있을 경우 , 이에 대한 처리법을 지원한다 . 타입 처리 뿐만 아니라 특정 값에 의한 메서드 실행도 가능하다 .