2023-06-14 20:09:16

추상 클래스라는 것은 이 클래스를 상속받아 클래스를 만들 때 이러한 메서드들을 만들어야 한다고 일종의 가이드라인을 제시해주는 것과 같습니다. 추상 클래스는 다음과 같이 메서드 목록만 존재하는 클래스입니다. 추상 클래스를 만들 때는 파이썬 표준 라이브러리인 abc를 활용합니다. 참고로 추상 클래스로는 객체를 찍어내지 않습니다. 다만 상속에만 사용되는 클래스입니다.

 

from abc import ABCMeta, abstractmethod


class Car(metaclass=ABCMeta):
    def __init__(self, company, name):
        self.company = company
        self.name = name

    @abstractmethod
    def show_company(self):
        '''제조사 정보를 보여줍니다
        '''
        pass

    @abstractmethod
    def show_name(self):
        '''차 이름을 보여줍니다
        '''
        pass

 

추상 클래스에 포함되어 있는 추상 메서드들은 이 추상 클래스를 상속받아 클래스를 만들 때 반드시 정의되어야 합니다. 추상 클래스 Car를 상속받아 HyundaiCar 클래스와 KiaCar 클래스를 만들어보도록 하겠습니다. 반드시 show_company() 메서드와 show_name() 메서드는 정의되어야 합니다. 추상 클래스를 상속받아 만든 클래스에 추가로 다른 메서드를 정의해주는 건 당연히 허용됩니다.

 

from abc import ABCMeta, abstractmethod


class Car(metaclass=ABCMeta):
    def __init__(self, company, name):
        self.company = company
        self.name = name

    @abstractmethod
    def show_company(self):
        '''제조사 정보를 보여줍니다
        '''
        pass

    @abstractmethod
    def show_name(self):
        '''차 이름을 보여줍니다
        '''
        pass


class HyundaiCar(Car):
    def __init__(self, name):
        self.company = '현대'
        self.name = name

    def show_company(self):
        print(f"이 차를 만든 회사는 {self.company}입니다.")

    def show_name(self):
        print(f"이 차의 이름은 {self.name}입니다.")

    def show_other_hyundai_car(self):
        print(f"현대에서 만든 다른 차에는 소나타, 그랜저 등이 있습니다.")


class KiaCar(Car):
    def __init__(self, name):
        self.company = '기아'
        self.name = name

    def show_company(self):
        print(f"이 차를 만든 회사는 {self.company}입니다.")

    def show_name(self):
        print(f"이 차의 이름은 {self.name}입니다.")

    def show_kia_service_center(self):
        print(f"기아차 서비스 센터는 여의도, 일산 등에 있습니다.")


sonata = HyundaiCar("소나타")
sonata.show_company()
sonata.show_name()
sonata.show_other_hyundai_car()

morning = KiaCar("모닝")
morning.show_company()
morning.show_name()
morning.show_kia_service_center()

 

위 코드를 실행하면 문제없이 sonata 객체와 morning 객체가 생성되고 해당 객체의 메서드들이 실행됩니다. 

 

 

하지만 만약 KiaCar 클래스에서 show_name 메서드 부분을 주석처리하고, morning.show_name() 부분도 주석처리한 후 코드를 실행하면 해당 클래스의 객체를 생성할 때 에러 메시지가 출력됩니다. 추상 메서드로 선언한 것을 정의하지 않았다는 의미입니다. 

 

...생략...

class KiaCar(Car):
    def __init__(self, name):
        self.company = '기아'
        self.name = name

    def show_company(self):
        print(f"이 차를 만든 회사는 {self.company}입니다.")

    # def show_name(self):
    #     print(f"이 차의 이름은 {self.name}입니다.")

    def show_kia_service_center(self):
        print(f"기아차 서비스 센터는 여의도, 일산 등에 있습니다.")


...중략...

morning = KiaCar("모닝")
morning.show_company()
# morning.show_name()
morning.show_kia_service_center()

 

 

Can't instantiate abstract class KiaCar with abstract method show_name

 

show_name이라는 추상 메서드를 가진 KiaCar 추상 클래스를 인스턴스화할 수 없다 이 정도의 의미가 되겠네요. 한 마디로 추상 메서드 제대로 정의하라는 말입니다.