Visual Studio 2010 공식 팀 블로그 @vsts2010

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


크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 워너비 2009/04/07 12:59

    그냥 개인적인 생각이지만, "Duck Typing 이란, 타입이 Dynamic 하게 변하는 것을 말합니다"은 조금 모호한 점이 있는 거 같습니다. Duck Typing자체가 dynamic을 의미하는 것이라기보다는, dynamic한 환경에서 상속에 의한 type검사보다는 요건을 갖춘 객체를 모두 받아들이자는 의미인거 같습니다. 물론 개인적인 생각입니다-_-;;.

    그리고 예제에서 두번째에 값이 안나온 건, play에서 리턴된 객체를 quak에서 리턴해주지 않아서 값이 나오지 않은 거 같습니다.

  2. directgraph 2009/04/07 13:33

    그러고 보니, quack에서 리턴 값을 void 를 선언했네요. 리턴 타입을 표현하지 않는 루비 코드를 옮기다 보니, 발생한 문제내요. T.T;

  3. 위너비님 말에 동의 합니다.
    If it walks like a duck and quacks like a duck, I would call it a duck.
    라는 말처럼 오리가 아닌 거위라도(다른 객체라도) 오리처럼 꽥꽥 거린다면(동일한 메써드를 가지고 있다면) 그것을 오리고 취급하는(동일 객체로 취급하는) 것입니다.
    이는 컴파일 언어에서 interface개념과 비슷하며,
    변수에 여러가지 타입의 값을 대입 할 수 있는 것은 전혀 별개의 문제 입니다.
    (상단에 참고소스 윗부분의 예제는 전혀 덕타입과 상관이 없습니다.)

  4. directedgraph 2009/04/07 19:20

    림다,워너비님 말이 맞는 것 같습니다. 제가 잘못된 글을 적었내요. 죄송합니다.
    포스팅 내용은 조금 수정했고요, 좋은 의견과 배움 감사드립니다. ^ ^;;;;

  5. 좋은 피드백으로 글이 더 다듬어 지니. 참 좋은 케이스네요 :)

    앞으로도 좋은글 부탁드립니다.

  6. 맨날맑음 2009/09/10 22:30

    알아듣기 쉽게 설명해 주셔서 잘 배워갑니다!