본문 바로가기
Python

[Python] abc 모듈과 @abstractmethod 로 추상클래스 만들기

by teamnova 2025. 11. 20.
728x90

안녕하세요. 

오늘은 abc 모듈과 @abstractmethod 로 추상클래스를 만들어보겠습니다. 

 

프로젝트 규모가 커지면서 특정 클래스를 상속받는 자식 클래스에 필수 메서드를 강제하고 싶을 때가 있습니다. 

이럴때 abc 모듈을 활용하여 추상클래스를 만들 수 있습니다. 

 

ABC (Abstract Base Class)
abc 모듈에서 가져오는 클래스입니다.
이 클래스를 상속받으면 해당 클래스는 "추상 클래스"가 됩니다.


특징: 추상 클래스는 그 자체로는 객체(인스턴스)를 생성할 수 없습니다.

오직 상속을 위한 부모 역할만 합니다.

@abstractmethod
메서드 위에 붙이는 데코레이터입니다.
이게 붙은 메서드는 "껍데기" 뿐이고, 내용은 비워둡니다(pass).


규칙: 부모 클래스에서 이 데코레이터가 붙은 메서드는, 자식 클래스에서 반드시오버라이딩하여 구현해야 합니다.

 구현하지 않으면 에러가 발생합니다.

 

예제

from abc import ABC, abstractmethod

# 1. 추상 클래스 정의 (설계도 역할)
class Notification(ABC):
    
    @abstractmethod
    def send(self, message):
        """이 메서드는 자식 클래스에서 무조건 구현해야 합니다."""
        pass

# 2. 자식 클래스 구현 (이메일)
class EmailNotification(Notification):
    def send(self, message):
        print(f"[이메일 전송] {message}")

# 3. 자식 클래스 구현 (SMS)
class SMSNotification(Notification):
    def send(self, message):
        print(f"[SMS 전송] {message}")

email = EmailNotification()
email.send("안녕하세요, 회원가입을 축하합니다.")

sms = SMSNotification()
sms.send("인증번호는 [1234]입니다.")

class NoSendNotification(Notification):
    # send 메서드를 구현하지 않음! (오류예시)
    pass

# 객체 생성 시도
test = NoSendNotification()

 

결과

[이메일 전송] 안녕하세요, 회원가입을 축하합니다.
[SMS 전송] 인증번호는 [1234]입니다.
Traceback (most recent call last):
  File "파일경로", line 32, in <module>
    test = NoSendNotification()
TypeError: Can't instantiate abstract class NoSendNotification without an implementation for abstract method 'send'