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_checkableProtocol의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병행 검토 - 런타임에서 강한 검증이 필요하다 →
Protocol의runtime_checkable만으로는 부족하므로 ABC, 명시적 검증 함수, Pydantic 등 별도 검증 수단을 고려한다.
Sources#
- Python
typing.Protocol/runtime_checkabledocumentation - PEP 544 — Protocols: Structural subtyping (static duck typing)
- Python
abcmodule documentation
Related vault notes#
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_checkable의issubclass()제한과 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 관행과 여전히 일치한다.