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()로 호출하면, 중복 없이 공통 동작을 적용할 수 있음
추상 클래스는 단순히 “형태만 강제하는 틀”이 아니라, 공통 속성과 동작을 강제·공유·재사용하는 강력한 도구라는 걸 기억하세요
'파이썬 > 클래스와 객체 지향' 카테고리의 다른 글
| 파이썬에서 __add__와 연산자 재정의 (1) | 2025.09.06 |
|---|---|
| 파이썬에서 @property와 setter의 올바른 사용법 (0) | 2025.09.06 |
| 추상화란 무엇인가?? (0) | 2025.09.01 |
| 파이썬 정적 메소드(Static Method) 이해하기 (0) | 2025.08.31 |
| 파이썬에서 클래스, 객체, 인스턴스, 개체 개념 정리 (0) | 2025.08.31 |