[C# 4.0] Duck Typing

C# 2009. 4. 6. 23:46 Posted by 알 수 없는 사용자
Dynamic 언어인 루비를 공부해 보신 분은 다음과 같은 구문을 많이 보셨을 겁니다.


X 라는 변수에 "hello" 라는 문자를 대입하고, 변수 X의 타입은 String입니다.


그리고 다시 X변수에 100을 넣으면, X변수의 타입은 Fixnum(Ruby에서 Integer를 표현하는 타입입니다)으로 변합니다.

여기에서도 알수 있듯이 동적인 언어에서는 Type이 동적으로 변합니다. 그래서 이런 속성을 이용해서 duck typing 이란 것을 구현할 수 있는데요. Dynamic language 를 주제로 검색엔진을 통해 검색해보면 항상 빠지지 않고 등장 하더군요.

그런데 왜 이름이 Duck Typing일 까요?

Ruby에서 Dynamic Typing에 관한 자료를 찾는 도중에, Duck typing을 좀 더 잘 이해할 수 있는 예제를 C# 4.0으로 구현해 보게 되었습니다.

참고 소스 : http://rubylearning.com/satishtalim/duck_typing.html


우선 Duck(오리) 클래스를 만들었고, 오리는 꽥꽥거리기도 하고(quack() 메소드), 수영도 하지요(swim())
오리만 있나요, 거위(Goose)도 있습니다. 마지막으로 오리의 꽥꽥거리는 소리를 내는 DuckRecoding이란 클래스도 만들었지요.

이제 꽥꽥거리게 만들어 보자구요.



2개의 static 메소드를 만들었습니다. parameter로 dynamic type의 duck이란 변수를 주고, 꽥꽥(quark()) 거리거나 수영(swim())하게 만들었습니다. 지금 duck변수는 오리인지, 거위인지, 아님 제 3의 조류인지 알 길이 없습니다. 

어떤 녀석들인지 확인해 보기로 하죠.


콘솔 출력을 이용해서. 첫번째 줄은, 진짜 오리로 하여금 꽥~~~~, 두번째 줄은 목소리를 녹음한 녹음기(DuckRecording)로 꽥~~~~~~, 세번째 줄은 오리 수영 시키기, 네번째 줄은 거위 수영시키기입니다.

이제 결과값을 보겟습니다.



첫번째 줄의 오리는 꽥~~ 거렷습니다. 두번째 줄은 무응답.... 세번째 줄은 오리가 수영을 하고 있군요. 네번째는 오리가 아닌 거위 수영입니다.  2번째 줄에서 예상되는 값은 꽥~~ 이었는데요, 나오지 않은 이유는 리턴 타입이 잘못 되어 있네요(죄송합니다. T.T).
아까 이렇게 선언했었지요.
 class DuckRecording
    {
        public void quack() { this.play(); }
        public string play() { return "Quark!"; }
    }


결론

위키디피아에서 Duck typing에 관해 다음과 같이 간단하게 적어 놓았네요.
If it walks like a duck and quacks like a duck, I would call it a duck.
오리처럼 행동하면 오리라 부를수 있다는 의미. String 처럼 행동한다면, String으로 다루어도 된다는 이야기. 결국 오브젝트의 부모나, 인터페이스의 영향보다, 그 오브젝트가 가진 메소드나 속성에 의해 그 오브젝트의  역활이 결정된다는 표현이 아닐까 하는게 제 생각입니다.

참고 사항 :  IronRuby에서 Fixnum 타입의 값이 to_f (Float type으로 변환)이 되지 않았습니다. 이유는 잘 모르겠네요. "methods"로 전체 메소드를 보면 to_f가 없는 것 같습니다. 

제가 알고 있는 Dynamic 언어인, Object C의 경우 Dynamic Object가 메소드를 호출 할 떄  런타임 하에서 그 오브젝트에 속한 메소드를 찾지 못하는 경우 런타임에서 경고로 넘어갑니다만, C# 4.0 에서는 Runtime Error 와 함께 VSTS 2010 이 죽고, Virtual PC가 얼어버리네요. 이 점은 정식 버젼이 나오면 다시 확인해 보고 싶습니다.

comment 를 확인하다 보니, 제가 쓴 글에 잘못된 내용이 있는 것 같네요. 그래서 글을 좀 수정했고요, 좋은 의견과 배움에 감사드립니다.