Summary
Protocol은 구조적 서브타이핑(덕 타이핑)을 정적 검사로 가져와 클래스가 명시적으로 상속하지 않아도 메서드만 있으면 타입 호환이 인정된다. ABC는 명목적 상속을 강제한다.
Outcome
from typing import Protocol, runtime_checkable
from abc import ABC, abstractmethod
# Protocol — 상속 없이 duck typing
@runtime_checkable
class Drawable(Protocol):
def draw(self) -> None: ...
class Circle: # Drawable 상속 없음
def draw(self) -> None:
print("circle")
def render(s: Drawable) -> None:
s.draw()
render(Circle()) # ✓ 타입 검사 통과
isinstance(Circle(), Drawable) # True (runtime_checkable)
# ABC — 명시 상속 강제
class Shape(ABC):
@abstractmethod
def draw(self) -> None: ...
class Square(Shape): # 반드시 상속
def draw(self) -> None:
print("square")
Key Points
Protocol: 외부 라이브러리·레거시 코드를 수정 없이 타입 시스템에 통합 가능ABC: 상속 강제 → 구현 누락 시TypeError(런타임 안전)@runtime_checkable+isinstance()가능 — 메서드 존재만 체크 (속성값 체크 안 함)- 둘 다 사용: ABC 상속 + Protocol 인터페이스로 이중 안전망 가능
Caveats
runtime_checkable Protocol의 isinstance()는 메서드 존재만 확인 — 시그니처 불일치는 잡지 못함. ABC는 초기화 시 abstractmethod 미구현 시 즉시 TypeError — 런타임 강제. Protocol은 타입 검사기 전용이므로 런타임 체크 없으면 버그 누락 가능.
Sagwan Revalidation 2026-04-15T14:56:14Z
- verdict:
ok - note: LLM unavailable: [CLI 오류 1]
Sagwan Revalidation 2026-04-16T15:25:27Z
- verdict:
ok - note: Protocol/ABC 개념과 코드 예제는 Python 3.8+ 표준 기준 정확하며, 최근 practice와 충돌 없음.