ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] abc 모듈과 추상 메서드 — 규칙을 코드로 표현하는 방법
    IT 2026. 1. 23. 11:03

    객체지향 이야기를 하다 보면 빠지지 않고 등장하는 말이 있습니다.

    “이 클래스는 반드시 이 메서드를 구현해야 합니다.”

    말로는 쉽지만, 코드로 이 규칙을 어떻게 강제할 수 있을까요? 파이썬에서는 이 문제를 abc 모듈과 추상 메서드(Abstract Method) 패턴으로 해결합니다. 이 글에서는 추상 메서드를 단순한 문법 기능이 아니라, 설계 의도를 코드에 남기는 방법으로 풀어보려 합니다.


    파이썬은 원래 느슨한 언어다

    파이썬의 기본 철학은 유연함입니다. 상속을 받아도, 부모 클래스의 메서드를 꼭 구현하지 않아도 에러는 나지 않습니다.

    class Animal:
        def speak(self):
            pass
    
    class Dog(Animal):
        pass

    이 코드는 문법적으로 아무 문제가 없습니다. 하지만 Dog는 사실상 불완전한 클래스입니다. 문제는 이 불완전함이 실행 시점까지 숨어 있다는 점입니다.


    추상 메서드는 언제 필요한가

    추상 메서드는 이런 상황에서 등장합니다.

    • 공통 인터페이스를 강제하고 싶을 때
    • 구현을 빠뜨린 클래스를 조기에 발견하고 싶을 때
    • “이 메서드는 반드시 구현돼야 한다”는 의도를 명확히 남기고 싶을 때

    즉, 추상 메서드는 기능이라기보다 계약(contract) 에 가깝습니다.


    abc 모듈의 등장

    파이썬은 이런 계약을 표현하기 위해 abc(Abstract Base Class) 모듈을 제공합니다.

    from abc import ABC, abstractmethod

    이 두 가지가 추상 메서드 패턴의 핵심입니다.

    • ABC → 추상 클래스의 기반
    • @abstractmethod → 반드시 구현해야 할 메서드 표시

    가장 단순한 추상 클래스 예제

    from abc import ABC, abstractmethod
    
    class Animal(ABC):
        @abstractmethod
        def speak(self):
            pass

    이제 이 클래스를 상속받는 클래스는 반드시 speak를 구현해야 합니다.

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

    만약 구현하지 않으면, 인스턴스를 만드는 시점에 에러가 발생합니다.


    왜 생성 시점에 에러가 날까

    여기서 중요한 포인트가 하나 있습니다. 추상 메서드는 클래스를 정의할 때가 아니라, 인스턴스를 생성할 때 검증됩니다.

    이 설계는 파이썬의 철학을 잘 보여줍니다.

    • 클래스 정의는 최대한 자유롭게
    • 실제 사용 시점에 규칙을 검증

    즉, abc는 파이썬 특유의 유연함을 해치지 않으면서도, 필요한 곳에는 단단한 규칙을 추가합니다.


    추상 클래스는 인스턴스를 만들 수 없다


    animal = Animal() # TypeError

    추상 메서드가 하나라도 남아 있는 클래스는 미완성 클래스로 취급됩니다. 이 점에서 추상 클래스는 “설계 단계의 클래스”라고 볼 수 있습니다.


    추상 메서드는 구현을 숨기지 않는다

    자주 오해되는 점이 하나 있습니다. 추상 메서드는 구현을 감추기 위한 수단이 아닙니다.

    파이썬에서 추상 메서드는 오히려 이렇게 말합니다.

    “어떻게 할지는 너가 정해라. 하지만 반드시 해야 한다.”

    그래서 추상 클래스는 상속 구조를 깔끔하게 만들고, 협업 시 실수를 줄이는 데 큰 역할을 합니다.


    인터페이스와의 관계

    자바 같은 언어에서는 인터페이스와 추상 클래스가 명확히 구분됩니다. 파이썬에서는 그 경계가 훨씬 느슨합니다.

    • 메서드만 정의하면 → 인터페이스처럼 사용 가능
    • 일부 구현을 포함하면 → 추상 클래스에 가까움

    중요한 것은 형식이 아니라, 의도입니다.


    언제 추상 메서드를 써야 할까

    모든 상속 구조에 추상 메서드가 필요한 것은 아닙니다. 하지만 다음과 같은 경우에는 강력한 도구가 됩니다.

    • 프레임워크나 라이브러리 코드
    • 팀 단위 협업에서 공통 규칙이 중요한 경우
    • 플러그인 구조처럼 확장이 전제된 설계

    반대로, 작은 스크립트나 개인 프로젝트에서는 과한 추상화가 될 수도 있습니다.


    마무리하며

    abc 모듈과 추상 메서드 패턴은 파이썬을 갑자기 엄격한 언어로 만드는 기능이 아닙니다.

    그보다는 이렇게 이해하는 편이 좋습니다.

    “필요한 곳에만 규칙을 추가할 수 있는 선택지”

    이 선택지를 언제, 어디에 쓰느냐가 객체지향 설계의 감각을 만들어 줍니다. 추상 메서드는 그 감각을 가장 정직하게 드러내는 도구 중 하나입니다.

Designed by Tistory.