노트

추상 기반 클래스 (ABC)

Abstract Base Classes (ABC)

CS#python · 연결된 개념 5개

쉽게 말하면

추상 기반 클래스는 '이 자리에 오려면 이 일은 꼭 할 줄 알아야 한다'고 적은 자격 요건표 같은 클래스예요. 필수 메서드를 하나라도 빼먹은 자식 클래스는 인스턴스를 만드는 순간 거절돼요.

비유가 깨지는 곳 요건표처럼 미리 걸러 주는 것 같지만, 오류는 클래스를 정의할 때가 아니라 인스턴스를 만들 때 나요. 상속 없이 모양만 맞으면 되는 경우라면 정적 검사기가 확인하는 typing.Protocol이 더 가벼워요.

추상 기반 클래스(Abstract Base Class, ABC)는 자식 클래스가 반드시 구현해야 할 메서드를 선언해 두는 클래스다. 추상 메서드를 하나라도 구현하지 않은 클래스는 인스턴스를 만들 때 TypeError가 난다.

from abc import ABC, abstractmethod
 
class PaymentGateway(ABC):
    @abstractmethod
    def charge(self, amount: int) -> str: ...
 
    def refund_all(self, ids):            # 구현이 있는 일반 메서드도 둘 수 있다
        return [self.refund(i) for i in ids]
 
    @abstractmethod
    def refund(self, payment_id: str) -> None: ...
 
class FakeGateway(PaymentGateway):
    def charge(self, amount): return "ok"
 
FakeGateway()   # TypeError: Can't instantiate abstract class ... refund
  • 오류는 클래스를 정의할 때가 아니라 인스턴스를 만들 때 난다
  • ABC를 상속하는 것은 metaclass=ABCMeta를 지정하는 것과 같다. 메타클래스(metaclass)는 "클래스를 만드는 클래스"로, 따로 지정하지 않으면 type이 쓰인다. ABCMeta가 추상 메서드 구현 여부를 검사한다
  • collections.abc에 Iterable, Mapping 같은 표준 ABC가 있어 isinstance(x, Iterable)처럼 쓴다

Protocol과 비교

파이썬은 덕 타이핑(duck typing) 언어라 "이 메서드가 있으면 그 타입으로 친다"가 기본이다. 상속을 강제하지 않고 모양만 맞추면 되는 타입 검사가 필요하면 typing.Protocol이 더 가볍다. 정적 타입 검사기가 구조로 호환성을 판단한다는 점에서 타입스크립트의 구조적 타이핑과 같다.

  • ABC: 명시적으로 상속해야 하고, 런타임에 강제된다
  • Protocol: 상속이 필요 없고, 주로 정적 검사기(mypy 등)가 확인한다

언제 쓰나

여러 구현을 갈아 끼우는 플러그인 구조, 테스트용 가짜 구현을 만들 때 인터페이스를 고정하는 데 쓴다. 고수준 코드가 구체 구현이 아니라 추상에 기대게 하는 의존성 역전 원칙이나, 같은 인터페이스 뒤에서 알고리즘을 바꾸는 전략 패턴과 함께 쓰인다. 하위 클래스가 약속을 지켜야 한다는 점은 리스코프 치환 원칙을 본다.

출처: abc 모듈 문서 · Python 용어집: abstract base class · typing.Protocol

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • TypeScript 클래스 문법

    TypeScript는 JavaScript 클래스에 접근 제어자(Access Modifier), readonly, 추상 클래스(Abstract Class), 생성자 매개변수 프로퍼티(Parameter Properties) 같은 타입 수준 문법을 더한다. 이들은 컴파일 때 검사에만 쓰이고, 출력 JS에서는 대부분 사라진다.

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

  • 타입 추론과 타입 검사

    타입 추론(Type Inference)은 표기가 없어도 컴파일러가 값의 타입을 정하는 단계이고, 타입 검사(Type Checking)는 정해진(추론됐거나 명시된) 타입을 코드가 지키는지 확인하는 단계다. 보통 추론이 먼저 일어나고, 그 결과를 기준으로 검사한다.

  • 템플릿 메서드 패턴

    알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.

  • 파이썬 기본 컬렉션

    파이썬의 기본 컬렉션은 리스트·튜플·딕셔너리·셋 네 가지다. 가장 중요한 구분은 변경 가능 여부(mutable·immutable)와 순서·중복을 어떻게 다루는가다.

보기 옵션