부부의 코딩 성장 일기

Python 추상화와 abc 라이브러리 본문

Python/Fundamentals

Python 추상화와 abc 라이브러리

펩시_콜라 2024. 2. 29. 19:00

추상화란?

  • 추상화란 프로그램의 세부 구현을 감추고 필요한 부분만을 노출시키는 것을 의미한다.
  • 추상클래스는 구현하지 않은 추상메소드를 한 개 이상 가지며, 자식 클래스에서 해당 추상 메소드를 반드시 구현하도록 강제한다.
  • 왜 그렇게 할까?
    • 이는 코드를 더 간결하게 만들고 모듈성을 높여 유지보수를 쉽게 만들어준다.
    • 만약 추상클래스가 여러개의 자식 클래스를 가지고 있고, 자식 클래스에서 추상 메소드에서 정의해야 하는 내용이 다르다면,
    • 추상클래스를 사용하는 것이 효율적이겠다. 

abc Library

  • 이는 python에서 추상 베이스 클래스(ABC - Abstract Base Class)를 정의하는 데 사용된다. 
  • 즉, 추상 베이스 클래스는 일종의 템플릿으로, 특정 메서드가 반드시 파생 클래스에서 구현되어야 함을 정의한다.
  • 이를 통해 코드의 일관성을 유지하고, 특정한 규칙을 따르도록 강제할 수가 있다. 
  • 아래의 예제를 보면 Shape은 area와 perimeter라는 추상 메서드를 가지고 있다.
    • 추상메서드는 메서드 생성 시, @abstractmethod라는 decorator로 감싸진다.
  • 그리고 Shape라는 클래스를 상속받은 Circle에서, 
    • 위에서 미구현 된 area, perimeter에 대해 정의를 하게 된다.
  • 만약에 Shape라는 클래스를 상속받은 class에서 추상 메서드를 정의하지 않으면, 에러가 발생한다. 
  • 만약 우리가 Shape를 상속받아서 Rectangle, Triangle이라는 클래스를 추가로 생성한다고 하면, 
    • area와 perimeter를 계산하는 방법이 달라질 수밖에 없으니, 추상화와 abc 라브러리를 사용하면, 코드의 일관성을 유지하고 특정 규칙을 따르도록 클래스를 설계하는 것이 가능해진다. 
from abc import ABC, abstractmethod

# 추상 베이스 클래스 정의
class Shape(ABC):

    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

# 추상 베이스 클래스를 상속받은 구체적인 클래스
class Circle(Shape):

    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius**2

    def perimeter(self):
        return 2 * 3.14 * self.radius

# 사용 예시
circle = Circle(5)
print("원의 면적:", circle.area())
print("원의 둘레:", circle.perimeter())