////

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

Protocol은 구조적 서브타이핑(덕 타이핑)을 정적 타입 시스템에 가져와, 클래스가 명시적으로 상속하지 않아도 필요한 멤버를 제공하면 타입 호환으로 인정한다. ABC는 명목적 상속 기반의 추상 인터페이스로, 구현 클래스가 명시적으로 상속하고 abstract method/property를 구현해야 인스턴스화할 수 있다.

////

Summary#

Protocol은 구조적 서브타이핑(덕 타이핑)을 정적 타입 시스템에 가져와, 클래스가 명시적으로 상속하지 않아도 필요한 멤버를 제공하면 타입 호환으로 인정한다. ABC는 명목적 상속 기반의 추상 인터페이스로, 구현 클래스가 명시적으로 상속하고 abstract method/property를 구현해야 인스턴스화할 수 있다.

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):      # Shape을 명시적으로 상속
    def draw(self) -> None:
        print("square")

Key Points#

  • Protocol: 외부 라이브러리·레거시 코드를 수정하지 않고 인터페이스에 맞는 타입으로 다룰 때 유용하다.
  • ABC: 프레임워크 내부 계층처럼 구현자가 명시적으로 계약을 따르게 하고 싶을 때 적합하다.
  • Protocol은 기본적으로 정적 타입 검사기(mypy, Pyright 등)를 위한 도구다.
  • @runtime_checkable을 붙인 Protocol은 isinstance()에 사용할 수 있고, 제한된 조건에서는 issubclass()에도 사용할 수 있다.
  • runtime_checkable의 런타임 검사는 타입 검사기가 하는 정밀한 시그니처 검사가 아니다. 멤버 이름의 존재 여부 중심이며, 메서드 시그니처나 속성 타입의 일치까지 검증하지 않는다.
  • ABC와 Protocol은 배타적 선택지가 아니다. ABC로 런타임 상속 계약을 강제하고, Protocol로 구조적 타입 호환성을 표현하는 식의 병행도 가능하다.

Caveats#

  • @runtime_checkable이 없는 Protocol은 런타임 isinstance() / issubclass() 검사에 사용할 수 없다.
  • @runtime_checkable Protocol의 isinstance()는 멤버 존재 여부 중심으로 동작한다. 시그니처 불일치나 타입 불일치를 잡아주지 않으므로 런타임 안전장치로 과신하면 안 된다.
  • issubclass(X, SomeProtocol)은 모든 runtime-checkable Protocol에 대해 안전하게 가능한 것이 아니다. 특히 메서드가 아닌 속성/멤버를 포함하는 데이터 Protocol(data protocol)은 클래스 객체만 보고 인스턴스 속성 존재를 판단할 수 없기 때문에 TypeError가 날 수 있다. issubclass()는 메서드만 가진 non-data Protocol에 한해 사용하는 것이 안전하다.
  • Python 3.12부터 runtime-checkable Protocol의 런타임 검사는 내부적으로 inspect.getattr_static() 기반으로 바뀌었고, runtime-checkable Protocol의 멤버 집합은 클래스 생성 시점에 고정(frozen)된다. 따라서 monkey patch로 Protocol에 멤버를 나중에 추가해도 isinstance() 결과에 반영되지 않는다.
  • ABC는 abstract method/property 미구현 클래스의 인스턴스화를 막아 런타임 계약을 더 강하게 만든다. 다만 ABC를 상속하지 않은 구조적으로 호환되는 클래스는 기본적으로 ABC 타입으로 인정되지 않는다.

When to choose#

  • 외부 객체가 필요한 메서드/속성만 제공하면 충분하다 → Protocol
  • 내부 클래스 계층을 통제하고 구현 누락을 런타임에 막고 싶다 → ABC
  • 정적 타입 호환성과 런타임 계약을 모두 강화하고 싶다 → ABC + Protocol 병행 검토
  • 런타임에서 강한 검증이 필요하다 → Protocolruntime_checkable만으로는 부족하므로 ABC, 명시적 검증 함수, Pydantic 등 별도 검증 수단을 고려한다.

Sources#

  • Python typing.Protocol / runtime_checkable documentation
  • PEP 544 — Protocols: Structural subtyping (static duck typing)
  • Python abc module documentation
  • personal_vault/knowledge/dev/python-typing.md — Protocol 예제와 타입 힌트 실전 맥락
  • personal_vault/knowledge/dev/python-typing-advanced.md — mypy/Pyright 및 고급 typing 맥락

Sagwan Revalidation 2026-05-04#

  • verdict: revise
  • note: 기존 핵심 설명은 유지하되, runtime_checkableissubclass() 제한과 Python 3.12 런타임 동작 변화 caveat를 명시적으로 보강한다.

Sagwan Revalidation 2026-05-06T09:41:01Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점은 현재도 유효함

Sagwan Revalidation 2026-05-07T10:04:51Z#

  • verdict: ok
  • note: Protocol/ABC 차이와 runtime_checkable 제한 설명이 현재도 유효함

Sagwan Revalidation 2026-05-08T10:12:13Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현재도 유효하다.

Sagwan Revalidation 2026-05-09T10:38:29Z#

  • verdict: ok
  • note: 핵심 설명과 예시는 Python 최신 practice 기준에서도 유효하다.

Sagwan Revalidation 2026-05-10T11:03:39Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점 모두 현재도 유효함

Sagwan Revalidation 2026-05-11T11:22:56Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 한계가 현재 Python practice와 부합함

Sagwan Revalidation 2026-05-12T11:36:37Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현행 Python 관행과 부합함

Sagwan Revalidation 2026-05-13T11:55:32Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의가 현재도 유효하다.

Sagwan Revalidation 2026-05-14T12:18:39Z#

  • verdict: ok
  • note: Protocol/ABC 차이와 runtime_checkable 한계 설명이 현재도 유효함

Sagwan Revalidation 2026-05-15T12:25:48Z#

  • verdict: ok
  • note: 핵심 설명과 주의사항이 현재 Python typing 관행과 여전히 일치함

Sagwan Revalidation 2026-05-16T12:43:27Z#

  • verdict: ok
  • note: 현재 Python typing/ABC 동작과 권장 구분이 여전히 유효함

Sagwan Revalidation 2026-05-17T13:10:42Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현재 Python typing 관행과 부합함

Sagwan Revalidation 2026-05-18T13:34:25Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점은 현재도 유효함

Sagwan Revalidation 2026-05-19T14:04:18Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의사항이 현재도 유효함

Sagwan Revalidation 2026-05-20T14:27:29Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현재도 유효함

Sagwan Revalidation 2026-05-21T15:02:45Z#

  • verdict: ok
  • note: Protocol 런타임 검사 한계와 ABC 대비 설명이 현재 Python typing 관행과 부합함

Sagwan Revalidation 2026-05-22T15:38:05Z#

  • verdict: ok
  • note: Protocol/ABC 차이와 runtime_checkable 주의점이 현재도 유효함

Sagwan Revalidation 2026-05-23T16:19:31Z#

  • verdict: ok
  • note: Protocol/ABC 차이와 runtime_checkable 주의점이 현재도 유효합니다.

Sagwan Revalidation 2026-05-24T16:38:42Z#

  • verdict: ok
  • note: Protocol/ABC 차이와 runtime_checkable 주의점이 현재도 유효함

Sagwan Revalidation 2026-05-25T17:49:04Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable caveat가 현행 practice와 부합함

Sagwan Revalidation 2026-05-26T18:26:24Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점은 현재도 유효함

Sagwan Revalidation 2026-05-27T18:53:29Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점은 현재도 유효하다.

Sagwan Revalidation 2026-05-28T19:26:30Z#

  • verdict: ok
  • note: 핵심 설명과 예시가 현재 Python typing/ABC 관행과 여전히 부합함

Sagwan Revalidation 2026-05-29T20:03:38Z#

  • verdict: ok
  • note: 핵심 설명과 예시가 현재 Python typing practice와 여전히 부합함

Sagwan Revalidation 2026-05-30T20:04:05Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현재 practice와 부합함

Sagwan Revalidation 2026-06-01T01:52:54Z#

  • verdict: ok
  • note: [chatgpt HTTP 401] {

Sagwan Revalidation 2026-06-02T02:10:20Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점이 현재 Python practice와 부합함

Sagwan Revalidation 2026-06-03T02:53:53Z#

  • verdict: ok
  • note: Protocol/ABC 설명과 runtime_checkable 주의점은 최신 practice와 부합함

Sagwan Revalidation 2026-06-04T02:57:37Z#

  • verdict: ok
  • note: 핵심 설명과 예제는 최신 Python typing 관행과 여전히 부합한다.

Sagwan Revalidation 2026-06-05T03:20:19Z#

  • verdict: ok
  • note: 핵심 설명과 caveat가 최신 Python typing 관행과 여전히 일치한다.

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1