파이썬의 ABC(Abstract Base Class, 추상 베이스 클래스) 는 객체지향 프로그래밍에서 "반드시 구현해야 하는 인터페이스(규약)를 정의하기 위한 클래스" 입니다.
쉽게 말하면,
"이 클래스를 상속받는 모든 자식 클래스는 특정 메서드를 반드시 구현해야 한다."
라는 규칙을 강제하는 기능입니다.
예를 들어, 여러 종류의 동물이 있다고 가정해봅시다.
모든 동물은 speak()라는 메서드를 가지고 있어야 한다고 가정합니다.
잘못 작성하면 다음과 같은 문제가 발생합니다.
class Dog:
def speak(self):
return "멍멍"
class Cat:
pass
cat = Cat()
cat.speak()
실행 결과:
AttributeError:
'Cat' object has no attribute 'speak'
개발자가 speak()를 구현하는 것을 깜빡했지만, 프로그램 실행 전까지는 알 수 없습니다.
ABC를 사용하면 이런 실수를 미리 방지할 수 있습니다.
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "멍멍"
dog = Dog()
print(dog.speak())
출력:
멍멍
class Cat(Animal):
pass
cat = Cat()
결과:
TypeError:
Can't instantiate abstract class Cat
with abstract method speak
객체 생성 자체가 막힙니다.
animal = Animal()
결과:
TypeError:
Can't instantiate abstract class Animal
with abstract method speak
ABC는 설계도 역할만 합니다.
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
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) 이라고 합니다.
class Payment(ABC):
↓
모든 결제 클래스는 pay()를 구현해야 함.
팀원이 새로운 결제 수단을 추가하더라도:
class NaverPay(Payment):
...
반드시 pay()를 구현해야 합니다.
ABC를 사용하면 IDE가:
class Animal(ABC):
@property
@abstractmethod
def name(self):
pass
구현:
class Dog(Animal):
@property
def name(self):
return "초코"
class Animal(ABC):
@abstractmethod
def speak(self):
pass
def sleep(self):
print("잠을 잔다.")
class Dog(Animal):
def speak(self):
print("멍멍")
dog = Dog()
dog.sleep()
출력:
잠을 잔다.
| 항목 | ABC | Protocol |
|---|---|---|
| 상속 필요 | O | X |
| 구현 강제 | O | X |
| 런타임 검사 | O | X |
| 덕 타이핑 | 제한적 | 매우 좋음 |
| 인터페이스 역할 | O | O |
| 객체 생성 방지 | O | X |
예:
Storage
├── S3Storage
├── LocalStorage
└── GCSStorage
모든 Storage는 반드시:
upload()
download()
delete()
를 구현하도록 강제할 수 있습니다.
→ ABC
→ Protocol (덕 타이핑)
ABC(Abstract Base Class)는 자식 클래스가 반드시 구현해야 하는 메서드를 강제하여, 일관된 인터페이스와 안전한 다형성을 제공하는 추상 클래스 시스템이다.