////

Python Protocol vs ABC — 덕 타이핑 vs 명시 상속

Protocol은 구조적 서브타이핑(덕 타이핑)을 정적 검사로 가져와 클래스가 명시적으로 상속하지 않아도 메서드만 있으면 타입 호환이 인정된다. ABC는 명목적 상속을 강제한다.

////

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와 충돌 없음.