동적 타이핑의 한 종류로, 다른 클래스더라도 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다.
duck typing 이라는 용어는 "만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다" 라는 덕테스트 에서 유래됐다.
"If it walks like a duck and it quacks like a duck, then it must be a duck"
duck typing이 없는 언어는 인자로 받는 객체의 타입을 검사한다. (i.e. java)
duck typing이 있는 언어는 인자로 받는 객체의 타입을 검사하지 않는다. 특정 메소드를 호출할 시점에 객체에 특정 메소드가 구현돼 있지 않다면 런타임 에러가 발생되고, 아니라면 그 객체의 특정 메소드가 호출된다.
아래 예제 코드에서 act()
함수가 호출될 때 인자의 타입을 검사하지 않는다.
class Duck:
def fly(self):
print("Duck flying")
class Parrot:
def fly(self):
print("Parrot flying")
class Whale:
def swim(self):
print("Whale swimming")
def act(entity):
entity.fly()
for animal in [Duck(), Parrot(), Whale()]:
act(animal)
Output
Duck flying
Parrot flying
AttributeError: 'Whale' object has no attribute 'fly'