[Fluent Python] ABC(Abstract Base Class, 추상 베이스 클래스) (260628)

WonTerry·2026년 6월 28일

Python

목록 보기
19/20

파이썬의 ABC(Abstract Base Class, 추상 베이스 클래스) 는 객체지향 프로그래밍에서 "반드시 구현해야 하는 인터페이스(규약)를 정의하기 위한 클래스" 입니다.

쉽게 말하면,

"이 클래스를 상속받는 모든 자식 클래스는 특정 메서드를 반드시 구현해야 한다."

라는 규칙을 강제하는 기능입니다.


1. 왜 ABC가 필요한가?

예를 들어, 여러 종류의 동물이 있다고 가정해봅시다.

  • 강아지
  • 고양이

모든 동물은 speak()라는 메서드를 가지고 있어야 한다고 가정합니다.

잘못 작성하면 다음과 같은 문제가 발생합니다.

class Dog:
    def speak(self):
        return "멍멍"


class Cat:
    pass
cat = Cat()
cat.speak()

실행 결과:

AttributeError:
'Cat' object has no attribute 'speak'

개발자가 speak()를 구현하는 것을 깜빡했지만, 프로그램 실행 전까지는 알 수 없습니다.

ABC를 사용하면 이런 실수를 미리 방지할 수 있습니다.


2. ABC 기본 사용법

Step1. ABC 상속

from abc import ABC, abstractmethod

class Animal(ABC):

    @abstractmethod
    def speak(self):
        pass

Step2. 자식 클래스 구현

class Dog(Animal):

    def speak(self):
        return "멍멍"
dog = Dog()
print(dog.speak())

출력:

멍멍

Step3. 구현하지 않으면 에러

class Cat(Animal):
    pass
cat = Cat()

결과:

TypeError:
Can't instantiate abstract class Cat
with abstract method speak

객체 생성 자체가 막힙니다.


3. 추상 클래스는 객체 생성이 불가능하다

animal = Animal()

결과:

TypeError:
Can't instantiate abstract class Animal
with abstract method speak

ABC는 설계도 역할만 합니다.


4. 여러 개의 추상 메서드 정의 가능

class Animal(ABC):

    @abstractmethod
    def speak(self):
        pass

    @abstractmethod
    def move(self):
        pass

구현

class Dog(Animal):

    def speak(self):
        return "멍멍"

    def move(self):
        return "달린다"

하나라도 빠지면?

class Cat(Animal):

    def speak(self):
        return "야옹"
cat = Cat()

결과:

TypeError:
Can't instantiate abstract class Cat
with abstract method move

5. 실무에서 가장 많이 사용하는 예제

결제 시스템

from abc import ABC, abstractmethod

class Payment(ABC):

    @abstractmethod
    def pay(self, amount):
        pass

카드 결제

class CardPayment(Payment):

    def pay(self, amount):
        print(f"{amount}원 카드 결제")

카카오페이

class KakaoPayment(Payment):

    def pay(self, amount):
        print(f"{amount}원 카카오페이 결제")

사용하는 코드

def checkout(payment: Payment):
    payment.pay(10000)
checkout(CardPayment())
checkout(KakaoPayment())

출력:

10000원 카드 결제
10000원 카카오페이 결제

이를 다형성(Polymorphism) 이라고 합니다.


6. ABC가 필요한 이유

① 인터페이스 강제

class Payment(ABC):

모든 결제 클래스는 pay()를 구현해야 함.


② 코드의 일관성

팀원이 새로운 결제 수단을 추가하더라도:

class NaverPay(Payment):
    ...

반드시 pay()를 구현해야 합니다.


③ IDE 자동완성 지원

ABC를 사용하면 IDE가:

  • 구현해야 할 메서드 표시
  • 타입 체크 지원
  • 코드 가독성 향상

7. 추상 프로퍼티도 만들 수 있다

class Animal(ABC):

    @property
    @abstractmethod
    def name(self):
        pass

구현:

class Dog(Animal):

    @property
    def name(self):
        return "초코"

8. 추상 클래스에도 일반 메서드가 있을 수 있다

class Animal(ABC):

    @abstractmethod
    def speak(self):
        pass

    def sleep(self):
        print("잠을 잔다.")
class Dog(Animal):

    def speak(self):
        print("멍멍")
dog = Dog()
dog.sleep()

출력:

잠을 잔다.

9. ABC와 Protocol의 차이

항목ABCProtocol
상속 필요OX
구현 강제OX
런타임 검사OX
덕 타이핑제한적매우 좋음
인터페이스 역할OO
객체 생성 방지OX

10. 실무에서는 언제 사용할까?

ABC를 사용하는 경우

  • 결제 시스템
  • 파일 저장소(Storage)
  • 데이터베이스 Repository
  • 메시지 큐
  • 플러그인 시스템
  • 전략 패턴(Strategy Pattern)

예:

Storage
 ├── S3Storage
 ├── LocalStorage
 └── GCSStorage

모든 Storage는 반드시:

upload()
download()
delete()

를 구현하도록 강제할 수 있습니다.


실무적인 기준

"반드시 이 메서드를 구현해야 한다"

ABC

"이 메서드가 있으면 된다"

Protocol (덕 타이핑)


한 문장으로 정리

ABC(Abstract Base Class)는 자식 클래스가 반드시 구현해야 하는 메서드를 강제하여, 일관된 인터페이스와 안전한 다형성을 제공하는 추상 클래스 시스템이다.

profile
Hello, I'm Terry! 👋 Enjoy every moment of your life! 🌱 My current interests are Signal processing, Machine learning, Python, Database, LLM & RAG, MCP & ADK, Multi-Agents, Physical AI, ROS2...

0개의 댓글