"이 모양 가지고 있다" 표현하는 두 방법
가끔 "이 함수는 열고 닫을 수 있는 거 받는다" 라고 말하고 싶어. 클래스 계층 신경 X — 어떤 메서드가 있는지 신경. Python 이 두 정식 방법 — typing.Protocol (구조 타이핑 — 모양으로 매치) 와 abc.ABC (명목 타이핑 — 상속으로 매치).
Duck typing — 비공식 버전
"이게 어떤 타입이어야 하나" 에 대한 원래 Python 답변 — 체크 X, 그냥 시도. *오리처럼 걷고 오리처럼 꽥꽥거리면 오리*. 런타임 동작엔 작동, 근데 정적 타입 체커한테는 아무것도 안 알려. 현대 Python 은 런타임 duck typing 유지 + 타입 레벨에 구조 protocol 추가.
Protocol — 구조 타이핑
typing.Protocol 상속하는 클래스 정의, 필요한 메서드/속성. 그 메서드 가진 모든 클래스 (호환 시그니처) 는 자동으로 서브타입 — 상속 불필요. 정적 타입 체커 (mypy) 가 검증. 런타임 isinstance 는 protocol 에 @runtime_checkable 표시 시만, 그것도 메서드 존재만 체크 (시그니처 X).
ABC — 추상 메서드 + 명목 타이핑
abc.ABC 상속 + 메서드에 @abstractmethod 표시. 서브클래스가 그 메서드들 구현해야 — 안 하면 인스턴스화 X. ABC 는 상속 통해 계약 강제 — 클래스가 서브타입이라고 명시적으로 선언해야. Protocol 보다 무거움, 진짜 계층 + 공유 베이스 구현 원할 때 적절.
Protocol — 유연, 상속 부담 X. 진짜로 클래스 계층 + 공유 베이스 동작 + 명시적 선언 원하면 ABC. Pippa 의 backend/adapters/base.py 의 Adapter 베이스가 ABC 인 이유 — 헬퍼 메서드 공유 + 진짜 계층 표현.