python - OOP - ABC(Abstract Base Class)

1 분 소요

python - OOP - ABC(Abstract Base Class)

  • ABC(Abstract Base Class)는 “구현되지 않고, 선언만 되어 있는 method가 포함된 class”를 말합니다. 구현되어 있지 않고 선언만 되어 있다는 것은, 이 ABC를 상속받은 Child Class에서 해당 method를 정의해줘야 한다는 것을 말하죠. 또한, 새롭게 child class에서 정의하지 않는 한, ABC는 고유의 instance를 만들 수 없습니다.
  • 이게, 무슨 의미가 있나? 싶지만, 코딩을 할 때 모든 class에서 동일하게 사용되는 interface를 ABC를 사용해서 구현하고 다른 class들에서 이 ABC를 모두 상속받도록 할 경우, 모든 class들이 한데 묶여서 관리됩니다. 만약, ABC에서 정의된 method가 상속받은 class에서 새롭게 정의되지 않았을 경우 에러를 발생하게 되죠.
  • 다만, 저는 OOP를 제대로 사용하고 싶다면 그냥 java를 사용하는 게 낫지 않나…싶기는 합니다.
  • 아래는 간단히 Abstract Base Class People를 만들고, 애를 상속받는 Engineer를 만들고 메소드를 실행해본 예제입니다.
from abc import ABC, abstractmethod

class People(ABC):
    # ABC를 상속하고
    def __init__(self, name):
        super().__init__()
        self.name = name

    # @abstractmethod decorator를 붙여줍니다.
    # 이를 통해 만약 해당 code가 구현되지 않았을 경우 error를 발생시키죠
    @abstractmethod
    def say_hello(self):
        ...

    # Abstract Base class의 모든 method가 미구현되는 것은 아닙니다.
    # `say_bye`처럼 구현되어 있는 method도 있죠.
    def say_bye(self):
        print("Bye, Bye, Bye")

class Engineer(People):
    def __init__(self, name, occupation):
        super().__init__(name)
        self.occupation = occupation

    # Abstract Base Class인 People, 
    # 즉 @abstractmethod 가 포함된 People을 상속받았으므로
    # say_hello를 구현해줘야 합니다.
    def say_hello(self):
        print(f"Hi, my name is {self.name}, I work as an {self.occupation}")

e1 = Engineer("frhyme", "engineer")

e1.say_hello()
# Hi, my name is frhyme, I work as engineer
e1.say_bye()
# Bye, Bye, Bye

댓글남기기