Structural Typing과 Duck Typing

Posted 2011.04.15 16:23

Duck Typing

duck typing에 대한 정의는 duck test를 정의한 다음 문장에 잘 나타난다.
오리처럼 소리내고, 오리처럼 걷는다면 오리라고 불러도 무방하다.
좀 더 구체적으로 정의하면, 해당 객체의 타입을 이용해 객체의 적합성 여부를 검증하기 보다는, 특정 객체가 호출하려는 메세지를 이해할 수만 있다면 사용해도 좋은 객체로 간주하겠다는 의미이다. 위키피디아의 duck typing 설명에 의하면, 다음과 같이 "객체를 구성하는 메서드와 프로퍼티가 객체의 유효 여부를 결정한다"고 정의되어 있다.
an object's current set of methods and properties determines the valid semantics
개인적으로는 Objective-C와 같이 메시지 호출과 객체의 구성 요소(메서드 혹은 프로퍼티)가 동적으로 분리(dynamic dispatching)될 수 있는 언어를 고려하면, "객체가 메시지를 이해할 수 있다면 유효하다고 간주한다"는 말이 좀 더 정확하다고 생각한다. 메세지 디스패칭을  동적으로  정의할 수도 있기 때문이다.

사전 준비

다음과 같이 클래스 Fish, Duck, Person를 정의하자.
class Fish {
 def swim = println("fish: swim")
}

class Duck {
 def quack = println("duck: quaaaack")
 def feathers = println("duck: white feathers")
}

class Person {
 def think = println("person: therefore I am")
 def quack = println("person: speak qua~~ack!")
 def feathers = println("person: wear feather clothing")
}

Structural Typing

Scala에서는 Structural Typing으로 type safe한 방법의 Duck Typing을 지원한다. 다음과 같이 Structural Type을 이용해 DuckLike 타입을 선언하자. DuckLike 타입은 quack, feathers 메서드가 정의된 어떤 타입과도 호환된다.
type DuckLike = { def quack; def feathers } // Structural Typing

def inTheForest( duckLike: DuckLike ) {
  duckLike.quack
  duckLike.feathers
}

/*
scala> inTheForest( new Duck )  
duck: quaaaack
duck: white feathers

scala> inTheForest( new Person )
person: speak qua~~ack!
person: wear feather clothing

scala> inTheForest( new Fish )
<console>:9: error: type mismatch;
 found   : Fish
 required: DuckLike
       inTheForest( new Fish )
                    ^

*/
동적 타입 언어와는 달리 해당 메시지를 이해할 수 있는지 미리 검증한다는 점에서 검증 시점의 차이가 존재한다. Ruby나 Python, Objective-C와 같은 다른 언어에서의 duck typing은 소개한 위키피디아 링크에 나와 있으니 참고하자.
저작자 표시 비영리 변경 금지
신고
« PREV : 1 : 2 : 3 : 4 : 5 : ··· : 87 : NEXT »

티스토리 툴바