'2013/04'에 해당되는 글 2건

  1. 2013.04.15 [colette Spring] "오더 숍"에 대해 알아보자.(4/15 갱신) 4
  2. 2013.04.05 Duck Typing에 대하여. 2

블로그에 글 쓰는 것도 간만이군요. 거두절미하고, 오늘은 리플렉 비트 콜레트 스프링에 새로 추가된 시스템 "오더 숍"에 대해 알아보도록 하겠습니다.

  • 수정에 도움 주신 분들

갈품님, "입문편 세번째" 내용에 대해 제보해 주셨습니다.

소미님, 악곡의 씨앗 세 번째와 매칭편 세번째를 제보해 주셨습니다.

  • 수정 기록
  • "오더 숍"이란?

간단히 말하면, "리플렉 비트 도전 과제" 같은 겁니다. "어떤 곡을 플레이해라"라든지, "어떤 조건으로 플레이해라" 같은 조건들을 내걸고, 그 조건에 맞춰서 몇 번 플레이하면 보상을 주는 겁니다. 도전 과제의 예로는 "매칭된 상태로 해라", "레벨 X의 곡을 해라" 같은 것들이 있지요. 도전 과제는 한번에 두 개까지 받을 수 있습니다.(단 레벨이 어느 정도 이상[제보 바랍니다] 오르면 세 개까지도 받을 수 있습니다.)

  • 이걸 왜 하고 있어야 하지?

스탬프해금곡 때문이죠. 물론 일부 도전과제는 저 두개를 주는 게 아니라 colette Winter 곡을 빠르게 해금하기 위해 필요한 장비를 주기도 합니다만, 그것도 "해금곡"이라 친다면 결론적으로는 사실상 저 두개를 노리고 하는 겁니다. 이번 colette Spring에서는 본인의 (Spring용) 장비 레벨이 해금할 수 있는 곡에 영향을 줍니다. 그러면 장비는 어떻게 얻냐고요? 당연히 스탬프죠. 물론 Spring 들어서 스탬프를 좀 관대하게 주는 느낌이 없진 않습니다만, 그래도 몰아서 하는 유저는 부족하기 마련입니다. 또한, 직접 해보면서 느낀 바로는, 매일 와서 챙겨가는 정도로는 부족합니다. 그럴 때 부족한 스탬프를 채우라는 의미로 내어 주는 도전과제죠.

또 하나의 목적으로는 "재미 없는 전곡순회에 스탬프라는 명분을 주어서 활력을 준다"는 것입니다. 전곡순회는 확실히 해 두면 실력에도 도움이 되고 뮤직 필을 채워서 앞으로 곡들을 해금하는 데도 도움이 됩니다만, 뭔가 게임을 억지로 하는 느낌이 들게 되어서 대부분의 사람들은 시간과 돈이 있어도 안 하기 마련입니다. 하지만 반복 가능한 도전 과제와 함께하면 스탬프라는 확실한 보상이 있으니 이제 전곡순회를 하는 것도 그렇게 기분이 나쁘지는 않겠죠.

  • 잘 알겠어. 그래서 오더 숍은 어떻게 하는 거냐?

오른쪽 아래의 오더 SHOP를 표시하기 버튼을 누릅시다.오른쪽 아래의 쁘띠하고 찾기 힘든(...) "오더 SHOP를 표시하기" 버튼을 누르면 오더 선택 창에 들어가실 수 있습니다.

왼쪽 위에는 지금 받고 있는 오더 목록이 나타납니다. 왼쪽 아래에는 모든 오더들이 나타납니다. 왼쪽 아래에서 오더를 선택하고 나면 오른쪽에서 오더를 승낙하면 됩니다.위에는 지금 받은 오더들이, 왼쪽 아래에는 자기에게 보이는 모든 오더들이 보입니다. 지금 받은 오더가 없다면 왼쪽 아래에서 받을 오더를 선택하고 오른쪽에서 오더를 승낙하면 됩니다.

  • 오더 숍 도전 과제 목록
  • 숫자에서 ?로 표기한 게 있다면 그건 제가 까먹었거나 모른다는 뜻입니다. 가끔은 부계를 파기 전에는 확인할 수 없는 골때리는 놈도 있으니 정보 주시면 감사하겠습니다.
  • 도전과제 중 반복 가능하다는 것을, 혹은 반복 불가능하다는 것을 확실히 확인한 과제는 표기하였습니다.
  • 기본 정렬 순서대로(즉, 번호순대로) 적었습니다.
  • 정확하지 않은 정보가 있으면 얼마든지 댓글로 알려주세요.

각 과제의 포맷은 다음과 같습니다.

n. 과제 이름 - 과제의 표기된 조건(실제 조건이나 힌트, 반복 가능 여부)
   보상: 해당 과제의 보상

    1. 입문편 첫번째 - 입문의 조각 1 한 개를 모아라!(BASIC 악곡 1곡을 플레이하세요, 반복 불가)
      보상: 스탬프 티켓 3개
    2. 입문편 두번째 - 입문의 조각 2 한 개를 모아라!(J-POP 카테고리나 히트차트의 악곡 1곡을 플레이하세요, 반복 불가)
      보상: 스탬프 티켓 3개
    3. 입문편 세번째 - 입문의 조각 3 한 개를 모아라!(사람과 매칭하세요, 반복 불가)
      보상: 스탬프 티켓 3개
    4. 이름편 "아"행 - "아"행의 조각 10개를 모아라(이름 정렬에서 あ行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    5. 이름편 "카"행 - "카"행의 조각 10개를 모아라(이름 정렬에서 か行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    6. 이름편 "사"행 - "사"행의 조각 10개를 모아라(이름 정렬에서 さ行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    7. 이름편 "타"행 - "타"행의 조각 10개를 모아라(이름 정렬에서 た行에 있는 악곡 플레이, 반복 가능)
      보상
      : 스탬프 티켓 3개(반복 수행시 1개)
    8. 이름편 "나"행 - "나"행의 조각 10개를 모아라(이름 정렬에서 な行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    9. 이름편 "하"행 - "하"행의 조각 10개를 모아라(이름 정렬에서 は行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    10. 이름편 "마"행 - "마"행의 조각 10개를 모아라(이름 정렬에서 ま行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    11. 이름편 "야"행 - "야"행의 조각 10개를 모아라(이름 정렬에서 や行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    12. 이름편 "라"행 - "라"행의 조각 10개를 모아라(이름 정렬에서 ら行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    13. 이름편 "와"행 - "와"행의 조각 10개를 모아라(이름 정렬에서 わ行에 있는 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    14. 레벨편 ☆1 - 레벨 1의 조각 8개를 모아라(레벨 1의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    15. 레벨편 ☆2 - 레벨 2의 조각 8개를 모아라(레벨 2의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    16. 레벨편 ☆3 - 레벨 3의 조각 8개를 모아라(레벨 3의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    17. 레벨편 ☆4 - 레벨 4의 조각 10개를 모아라(레벨 4의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    18. 레벨편 ☆5 - 레벨 5의 조각 10개를 모아라(레벨 5의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    19. 레벨편 ☆6 - 레벨 6의 조각 10개를 모아라(레벨 6의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    20. 레벨편 ☆7 - 레벨 7의 조각 18개를 모아라(레벨 7의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 4개(반복 수행시 ?개)
    21. 레벨편 ☆8(추정) - 레벨 8의 조각 ?개를 모아라(레벨 8의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 ?개)
    22. 레벨편 ☆9(추정) - 레벨 9의 조각 ?개를 모아라(레벨 9의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 ?개)
    23. 레벨편 ☆10(추정) - 레벨 10의 조각 ?개를 모아라(레벨 10의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 ?개)
    24. 레벨편 ☆10+(추정) - 레벨 10+의 조각 ?개를 모아라(레벨 10+의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 ?개)
    25. 난이도편 BASIC - BASIC의 조각 ?개를 모아라(BASIC 패턴 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    26. 난이도편 MEDIUM - MEDIUM의 조각 ?개를 모아라(MEDIUM 패턴 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    27. 난이도편 HARD - HARD의 조각 ?개를 모아라(HARD 패턴 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    28. 장르편 J-POP이 좋아 - J-POP의 조각 9개를 모아라(J-POP 카테고리의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    29. 장르편 애니메이션·게임이 좋아 - 애니메이션·게임의 조각 10개를 모아라(애니메이션·게임 카테고리의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    30. 장르편 버라이어티가 좋아 - 버라이어티의 조각 8개를 모아라(버라이어티 카테고리의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    31. 장르편 코나미 오리지널이 좋아 - 코나미 오리지널의 조각 11개를 모아라(코나미 오리지널 카테고리의 악곡 플레이, 반복 가능)
      보상: 스탬프 티켓 3개(반복 수행시 1개)
    32. 버전편 초대작 - 초대작의 조각 ?개를 모아라(초대작부터 있던 곡을 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    33. 버전편 라임라이트 - 라임라이트의 조각 ?개를 모아라(라임라이트 시절의 곡을 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    34. 버전편 콜레트 - 콜레트의 조각 ?개를 모아라(ver. colette 카테고리에서 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 1개)
    35. 매칭편 누구라도 함께! - 매칭 1의 조각 ?개를 모아라(매칭 플레이, 반복 가능)
      보상: 스탬프 티켓 ?개(반복 수행시 2개)
    36. 매칭편 팀 멤버와 함께! - 매칭 2의 조각 12개를 모아라(팀 멤버와 매칭, 반복 가능)
      보상: 스탬프 티켓 6개(반복 수행시 ?개)
    37. 매칭편 프렌드와 함께! - 매칭 3의 조각 ?개를 모아라(상호 프렌드와 매칭, 반복 가능)
      보상: 스탬프 티캣 ?개(반복 수행시 ?개)
    38. 겨울 장비 머리편 ☆1 - 레벨 1의 조각 8개를 모아라(레벨 1 악곡 플레이)
      보상: colette Winter 헬멧 Lv. 1
    39. 겨울 장비 머리편 ☆2 - J-POP의 조각 8개를 모아라(J-POP 카테고리의 악곡 플레이)
      보상: colette Winter 헬멧 Lv. 2
    40. 겨울 장비 머리편 ☆3 - 콜레트의 조각 10개를 모아라(ver. colette 카테고리의 악곡 플레이)
      보상: colette Winter 헬멧 Lv. 3
    41. 겨울 장비 머리편 ☆4 - 겨울의 조각 10개를 모아라(colette Winter 시절의 악곡 플레이)
      보상: colette Winter 헬멧 Lv. 4
    42. 겨울 장비 머리편 ☆5 - "마"행의 조각 12개를 모아라(이름 정렬에서 ま行에 있는 악곡 플레이)
      보상: colette Winter 헬멧 Lv. 5
    43. 겨울 장비 머리편 ☆6(추정) - 조건 확인하고 업데이트하겠습니다.
      보상(추정): colette Winter 헬멧 Lv. 6
    44. 겨울 장비 몸통편 ☆1 - 레벨 3의 조각 8개를 모아라(레벨 3 악곡 플레이)
      보상: colette Winter 의상 Lv. 1
    45. 겨울 장비 몸통편 ☆2 - 겨울의 조각 8개를 모아라(colette Winter 시절의 악곡 플레이)
      보상: colette Winter 의상 Lv. 2
    46. 겨울 장비 몸통편 ☆3 - 라임라이트의 조각 8개를 모아라(limelight 시절의 악곡 플레이)
      보상: colette Winter 의상 Lv. 3
    47. 겨울 장비 몸통편 ☆4 - 애니메이션·게임의 조각 10개를 모아라(애니메이션·게임 카테고리의 악곡 플레이)
      보상: colette Winter 의상 Lv. 4
    48. 겨울 장비 몸통편 ☆5 - "카"행의 조각 12개를 모아라(이름 정렬에서 か行에 있는 악곡 플레이)
      보상: colette Winter 의상 Lv. 5
    49. 겨울 장비 몸통편 ☆6(추정) - 조건 확인하고 업데이트하겠습니다.
      보상(추정): colette Winter 의상 Lv. 6
    50. 겨울 장비 소지품편 ☆1 - 레벨 2의 조각 8개를 모아라(레벨 2 악곡 플레이)
      보상: colette Winter 소지품 Lv. 1
    51. 겨울 장비 소지품편 ☆2 - 코나미 오리지널의 조각 8개를 모아라(코나미 오리지널 카테고리의 악곡 플레이)
      보상: colette Winter 소지품 Lv. 2
    52. 겨울 장비 소지품편 ☆3 - 겨울의 조각 8개를 모아라(colette Winter 시절의 악곡 플레이)
      보상: colette Winter 소지품 Lv. 3
    53. 겨울 장비 소지품편 ☆4 - 초대작의 조각 10개를 모아라(초대작부터 있던 악곡 플레이)
      보상: colette Winter 소지품 Lv. 4
    54. 겨울 장비 소지품편 ☆5 - "하"행의 조각 12개를 모아라(이름 정렬에서 は行에 있는 악곡 플레이)
      보상: colette Winter 소지품 Lv. 5
    55. 겨울 장비 소지품편 ☆6(추정) - 조건 확인하고 업데이트하겠습니다.
      보상(추정): colette Winter 소지품 Lv. 6
    56. 악곡의 씨앗 첫번째 - 악곡의 조각 3개를 모아라(colette Spring 신곡 플레이)
      보상: colette Garden에서 신곡을 해금할 수 있는 씨앗(!)
    57. 악곡의 씨앗 두번째 - 악곡의 조각 6개를 모아라(colette Spring 신곡 플레이)
      보상: colette Garden에서 신곡을 해금할 수 있는 씨앗
    58. 악곡의 씨앗 세번째 - 악곡의 조각 9개를 모아라(colette Spring 신곡 플레이)
      보상: colette Garden에서 신곡을 해금할 수 있는 씨앗
    • 검색어용 키워드

    콜레트 스프링, 오더 숍, 오더 숍 번역, 콜레트 오더 숍, 콜레트 오더 숍 번역, 콜레트 도전과제, 콜레트 도전과제 번역, 오더 샵, 오더 샵 번역, 콜레트 오더 샵, 콜레트 오더 샵 번역

    Posted by 애쉬군
    ,

    Duck Typing에 대하여.

    Coding 2013. 4. 5. 04:39

    오리처럼 울고 오리처럼 걷고 오리의 깃털을 가진 축생은 오리라 할 수 있을까요?

    카테고리가 코딩인데 뭔 뜬금없는 오리 이야기냐 하시겠지만, 일단 파이선에서는 그렇다고 합니다.

    # coding=UTF-8[각주:1]
    
    class Duck:
      def Quack(self):
        print "꽤애애애애애액!"
      def Feathers(self):
        print "이 오리는 녹색 깃털로 뒤덮여 있습니다."
    
    class Person:
      def Quack(self):
        print "이 사람은 최대한 애처롭게 꽤애액 거립니다."
      def Feathers(self):
        print "이 사람은 임기응변으로 땅에 떨어진 오리의 깃털을 줍습니다."
    
    donald = Duck()
    jack = Person()
    
    print "- 도날드의 경우 -"
    donald.Quack()
    donald.Feathers()
    print ""
    print "- 잭의 경우 -"
    jack.Quack()
    jack.Feathers()
    

    이 코드를 실제로 돌려보면 이런 결과가 나옵니다.

    1
    2
    3
    4
    5
    6
    7
    

    - 도날드의 경우 - 꽤애애애애애액! 이 오리는 녹색 깃털로 뒤덮여 있습니다. - 잭의 경우 - 이 사람은 최대한 애처롭게 꽤애액 거립니다. 이 사람은 임기응변으로 땅에 떨어진 오리의 깃털을 줍습니다.

    앞에서 "오리처럼 울고 오리처럼 걷고 오리의 깃털을 가진 축생"의 이야기를 꺼냈는데, 그러면 이 축생과 이 예의 공통점은 무엇일까요? 그렇습니다, 뭔가 미심쩍지만 Duck에게서 코더가 예상하고 있는 "Duck처럼 Quack할 수 있고 Duck의 Feathers를 갖고 있는" 특징을 그대로 가지고 있으니 Person도 Duck이라고 치는 것이지요. 이것을 보고 Duck typing이라고 합니다. 오리의 예를 들어서 성립된 개념이니까 Duck typing이라는 이름이 붙은 것이지요.[각주:2]

    Duck typing이라는 용어가 생겨난 것 자체는 2000년으로 거슬러 올라간다고 합니다.[각주:3] 파이선 뉴스그룹에 이런 글이 올라온 것이 시초였죠.

    그러니까, 그게 오리인지 검사하지 말고, 당신에게 오리의 무슨 행동이 필요한지에 따라 오리처럼 우는지, 오리처럼 걷는지, 등등, 등등 적절한 행동을 오리처럼 하는지 검사하세요.[각주:4]

    - Alex Martelli, 2000

    파이선은 인터페이스 같은 삽질을 하지 않고도[각주:5] 단지 클래스에서 적절한 함수의 이름을 불러주는 것만으로도 인터페이스 비스무리한 짓거리 내지는 인터페이스가 구현하고자 하는 바를 이룰 수 있습니다! 오오 파이선!

    ......이면 지금 이 포스팅의 제목이 파이선 강의가 되었어야겠죠.

    저 Duck typing이라는 개념은 꽤 논란이 있는 개념입니다. 뭐 일단 앞에서 주구장창 말씀드렸다시피 다중상속이니 추상클래스 구현이니 같은 장대한 삽질을 하지 않고도 비슷한 일을 하는 함수가 이름이 같으면 코드를 그대로 컨트럴 씨브이를 시전해도 잘 돌아갑니다. 예를 들어 오리 클래스를 만들었으니 이번에는 오리랑 비슷하게 꽥꽥거리는 거위 클래스를 만들고 싶겠죠. 분명 이것도 꽥꽥거리고 깃털이 있지만 오리는 아니니 오리에서 상속시키기도 난감하고, 그래서 그냥 새로 하나 만들기로 합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    # coding=UTF-8
    
    class Duck:
      def Quack(self):
        print "꽤애애애애애액!"
      def Feathers(self):
        print "이 오리는 녹색 깃털로 뒤덮여 있습니다."
    
    class Swan:
      def Quack(self):
        print "꽤애애애애애액!"
      def Feathers(self):
        print "이 거위는 매우 아름다운 흰 털에 싸여 있습니다."
    

    이 거위(class Swan)도 물론 아까와 마찬가지로 울부짖을(?) 수 있습니다. 또, 갑자기 도날드의 종을 Swan으로 바꿔야 할 때도 다른 부분은 냅두고 donald = Duck() 부분만 donald = Swan()으로 바꿔준다면 쉽게 유지보수가 가능합니다.

    이렇게 보면 기존 코드 재활용에도 좋고, 간편한게 덕 타이핑인 것 같습니다만, 문제는 오리처럼 울고 오리의 깃털을 가진 게 용일 때 발생합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    # coding=UTF-8
    
    class Dragon:
      def Quack(self):
        print "키에에에에에엥!"
        raise Exception("용이 빡쳐서 화염을 내뿜었습니다.")
      def Feathers(self):
        print "이 용은 오리의 그것과 닮은 녹회색 깃털을 달고 있습니다."
    
    donald = Dragon()
    
    print "- 용 도날드의 경우 -"
    donald.Quack()
    donald.Feathers()
    

    보시다시피, Dragon은 분명 울기도 하고 깃털도 있지만, 이 놈의 울음소리는 예사 울음소리가 아니라 돌려보는 것 자체가 Exception이 됩니다(...). 이걸 돌려보면 아래와 같은 결과가 나타납니다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    - 용 도날드의 경우 -
    키에에에에에엥!
    Traceback (most recent call last):
      Line 13, in <module>
        donald.Quack()
      Line 6, in Quack
        raise Exception("용이 빡쳐서 화염을 내뿜었습니다.")
    Exception: 용이 빡쳐서 화염을 내뿜었습니다.
    

    깃털을 볼 새도 없이 용이 화염을 내뿜어서 프로그램이 조기종료되어버렸습니다! 이처럼 클래스가 Quack이란 메서드를 가지고 있긴 한데 그 Quack이 우리가 생각하는 그 Quack이 아니라면 저런 식으로 얼마든지 문제를 일으킬 소지가 있는 것입니다. 물론 Dragon에 대해 첨부된 문서를 보고 거기서 Quack에 대한 설명을 주의깊게 읽었다면 저런 문제를 일으킬 리가 없기는 합니다.

    덕 타이핑 자체는 꽤나 편리한 개념이라 정적 타입 언어인 C#과 .NET 프레임워크에까지 도입되는 기염을 토하게 됩니다. dynamic이라는 키워드가 그것인데요, 예를 들어 dynamic q;를 선언해두고 q.Quack()을 호출하면 q라는 클래스에 인자 없는 Quack이라는 함수가 있다면 그걸 그대로 부르게 됩니다.

    하지만 위에서 보여준 여러 가지 문제점들 때문에 저는 개인적으로 덕 타이핑을 쓰지 않습니다. 일단 덕 타이핑의 강점은 복붙이 편리하다는 점인데, 저렇게 문서 다 체크하고 앉아있으면 그 편의성도 결국에는 날려먹게 되죠. 또한, 함수를 호출하기 전에 최소한 그 함수가 속해 있는 클래스가 무엇인지 기본적으로는 알아야 한다는 것이 제가 프로그램을 짤 때 기본적인 철칙입니다. 오리의 비유를 다시 들자면, 그게 오리처럼 날아다니건 깃털이 오리같이 생겼건 오리과에 속해 있지 않으면 오리고 뭐고  무엇보다 결정적으로 제가 주로 쓰는 C#에는 dynamic 같은 짓 안 해도 인터페이스추상 클래스라는 신의 발명품이 있습니다.

    interface IAnatidae[각주:6]
    {
        public void Quack();
        public string Feathers { get; }
    }
    
    class Duck : IAnatidae
    {
        public void Quack()
        {
            Console.WriteLine("꽤애애애애애액!");
        }
    
        public string Feathers
        {
            get { return "녹색 깃털"; }
        }
    }
    

    여기서 오리가 될지 뭐가 될지는 모르겠지만 오리과에 속하는 뭔가를 풀고 싶으면 IAnatidae의 변수를 하나 선언해주면 됩니다. 뭔진 모르겠지만 그건 IAnatidae의 Quack 메서드와 Feathers 속성을 그대로 가지고 있을 거거든요. 그리고 그걸 울게 만들고 싶다면 그 변수에서 Quack 메서드 한 방 때려주면 됩니다. 복붙도 쉽습니다. 상대가 같은 IAnatidae면 선언할 때 생성자 하나 바꿔주면 땡입니다. 물론 누군가 악의적으로 Dragon을 IAnatidae로 속여서 그걸로 문제를 일으키는 것까지 막지는 못합니다. 하지만 최소한 "오리처럼 운"다고 해서 용이 오리가 되지는 않습니다.

    두 번째 문제는 역시 성능입니다. 덕 타이핑이 개입된다는 얘기는, 메서드나 속성의 이름을 가지고 함수를 찾아야 한다는 얘기입니다. 그러니까, 클래스를 본다→이름 표에서 "Quack"을 찾는다→Quack들 중에 인자를 받지 않으며 메서드인 것을 찾는다→찾아낸 메서드를 호출한다 라는 과정을 거쳐야 한다는 얘깁니다. 반면에 앞에서 말씀드린 인터페이스를 사용하는 언어에서는 클래스를 본다→IAnatidae 인터페이스에 정의된 Quack이 어디에 구현되어 있는지 주소표를 본다→구현된 메서드를 호출한다 라는 과정으로 이루어집니다. 앞에 비하면 빠르겠죠. 물론 그 성능차이를 씹어먹을 정도로 덕 타이핑이 편하면 모를까, 저는 앞의 이유로 덕 타이핑이 그 정도로 편하다고 생각하지는 않습니다.

    이런 이유로 저는 덕 타이핑이란 개념 자체는 나쁘지 않다고 생각합니다만, 그것을 제가 실제로 사용하지는 않습니다. 여러분의 생각은 어떠신가요?

    1. 원래의 영어로 된 예제에서는 이 놈이 필요 없었습니다. 그러나 본 블로그의 주 언어는 한국어(...)이므로 설명을 위해 print 문에 한글을 쓰다보니 저 주석이 필요해지더군요. [본문으로]
    2. 저 "오리처럼 울고 오리처럼 걷는 축생"의 이야기는 사실 프로그래밍이라는 개념이 생기기 한참 전에 나온 "오리 테스트"라는 개념입니다. 귀납 논증을 까거나(오리처럼 걷는다고 다 오리냐?) 쉽게 이해시킬 때(오리처럼 걷고 오리처럼 우니까 새로운 오리의 종이 틀림없어) 사용되는 개념이죠. [본문으로]
    3. 출처 http://en.wikipedia.org/wiki/Duck_typing [본문으로]
    4. In other words, don't check whether it IS-a duck: check whether it QUACKS-like-a duck, WALKS-like-a duck, etc, etc, depending on exactly what subset of duck-like behaviour you need to play your language-games with. [본문으로]
    5. ......태클 거실 분들을 위해, 물론 파이선에도 인터페이스와 추상 클래스라는 개념은 존재합니다. 다만 인터페이스가 Duck typing보다 꽤나 늦게 도입된 편입니다. [본문으로]
    6. I오리과(......) [본문으로]
    Posted by 애쉬군
    ,