덕 타이핑은 「객체의 "종류(type)"가 아니라 "행동(method)"으로 그 객체를 판단하는」 파이썬의 철학입니다.
「오리처럼 걷고 오리처럼 운다면 그것은 오리다(If it walks like a duck and quacks like a duck, it's a duck)」라는 격언에서 유래했습니다.
기본 발상.
자바·C#은 「이 함수는 Duck 클래스의 인스턴스만 받는다」는 식의 엄격한 타입 검사를 합니다.
파이썬은 「이 함수는 quack() 메서드를 가진 어떤 객체든 받는다」는 식입니다.
「행동을 가지면 충분하다」는 사고입니다.
예시.
def make_noise(obj): obj.quack().
class Duck: def quack(self): print("꽥꽥").
class Person: def quack(self): print("오리 흉내내는 사람").
make_noise(Duck()) — "꽥꽥".
make_noise(Person()) — "오리 흉내내는 사람".
두 클래스가 상속 관계가 없어도 quack() 메서드만 있으면 같은 함수에 넘길 수 있습니다.
장점.
1) 「유연한 코드」 — 새 클래스가 기존 인터페이스를 따르기만 하면 즉시 통합.
2) 「테스트 쉬움」 — 모의(mock) 객체가 진짜 클래스를 흉내 내기만 하면 됨.
3) 「상속 강요 없음」 — 상속 없이도 호환 가능.
「파이썬다움(pythonic)」의 큰 부분입니다.
단점·진화.
큰 코드에서는 「오리인 줄 알았는데 알고 보니 거위였다」 같은 런타임 오류가 날 수 있습니다.
그래서 typing.Protocol(Python 3.8+) — 「이 메서드들이 있으면 이 타입으로 본다」는 명시적 표현 — 이 등장했습니다.
「덕 타이핑의 유연성 + 타입 힌트의 안전성」을 결합한 형태로, 모던 파이썬의 권장 패턴입니다.
한 줄 요약
덕 타이핑은 「행동(메서드)으로 객체를 판단」하는 파이썬 철학입니다.
유연하지만 런타임 오류 위험이 있어, 모던 파이썬은 typing.Protocol로 「덕 타이핑 + 타입 힌트」를 결합합니다.
더 알아볼 것
- typing.Protocol — 구조적 서브타이핑
- ABC vs Protocol
- EAFP와 LBYL — 두 코딩 스타일