파이썬/클래스와 객체 지향

추상 클래스 제대로 쓰기: 변수·일반 메서드·super() 재사용

Data Jun 2025. 9. 1. 13:57

1. 추상 변수 강제하기

 

추상 클래스는 단순히 메서드만 강제할 수 있는 게 아니라, 자식 클래스가 반드시 특정 속성을 갖도록 유도할 수도 있습니다.
파이썬에서는 @property와 @abstractmethod를 함께 사용하면, 자식 클래스가 해당 변수를 구현하도록 강제할 수 있습니다.

from abc import ABC, abstractmethod

class Shape(ABC):
    """도형 클래스"""

    @abstractmethod
    def draw(self):
        """도형을 그린다"""
        pass

    @property
    @abstractmethod
    def x(self):
        """x 좌표 getter"""
        pass

    @property
    @abstractmethod
    def y(self):
        """y 좌표 getter"""
        pass

이제 Shape를 상속받는 클래스는 반드시 x, y 속성을 구현해야만 인스턴스를 만들 수 있습니다

class Circle(Shape):
    def __init__(self, x, y, r):
        self._x = x
        self._y = y
        self.r = r

    def draw(self):
        print(f"({self._x}, {self._y}) 위치에 반지름 {self.r}인 원 그리기")

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y

circle = Circle(3, 4, 5)
circle.draw()

출력:

(3, 4) 위치에 반지름 5인 원 그리기

이렇게 하면 모든 도형 클래스가 좌표를 공통적으로 가지도록 강제할 수 있습니다.

 

2. 추상 클래스에 일반 메서드 넣기

추상 클래스에는 꼭 추상 메서드만 있어야 하는 건 아닙니다. 자식 클래스가 그대로 상속받아 쓸 수 있는 일반 메서드도 포함할 수 있습니다.

class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

    def draw_line(self):
        """공통적으로 쓸 수 있는 메서드"""
        print("-" * 30)

class Triangle(Shape):
    def draw(self):
        print("삼각형 그리기")

t = Triangle()
t.draw()
t.draw_line()

출력:

삼각형 그리기
------------------------------

공통 기능은 추상 클래스에 일반 메서드로 두고, 자식 클래스가 그대로 가져다 쓰면 됩니다.

 

3. 추상 메서드에 코드 작성 + super() 활용

추상 메서드도 **내용(바디)**를 가질 수 있습니다. 보통 모든 자식 클래스에서 공통으로 실행돼야 하는 코드를 넣고, 자식 클래스에서 super()로 불러 사용합니다.

class Shape(ABC):
    @abstractmethod
    def draw(self):
        print("도형을 그리는 중...")  # 공통 부분

class Square(Shape):
    def draw(self):
        super().draw()   # 공통 동작 실행
        print("정사각형 그리기")

s = Square()
s.draw()

출력:

도형을 그리는 중...
정사각형 그리기

이렇게 하면 공통 로직은 부모 추상 클래스, 세부 구현은 자식 클래스에서 담당할 수 있어 중복을 줄이고 일관성을 유지할 수 있습니다.

 

 

정리하면

  • 추상 변수 강제: @property + @abstractmethod로 자식 클래스가 반드시 속성을 구현하게 할 수 있음
  • 일반 메서드 활용: 추상 클래스에도 일반 메서드를 넣어 공통 기능을 상속 가능
  • super()로 공통 코드 재사용: 추상 메서드에 바디를 두고 자식 클래스에서 super()로 호출하면, 중복 없이 공통 동작을 적용할 수 있음

추상 클래스는 단순히 “형태만 강제하는 틀”이 아니라, 공통 속성과 동작을 강제·공유·재사용하는 강력한 도구라는 걸 기억하세요