Python/클래스

Python 추상클래스(abstract class)

Yonggyu 2023. 9. 25. 17:02
반응형

 

추상클래스 (abstract class)

- 추상 메소드를 가지고 있는 클래스 : ABC 클래스를 상속 받아야 된다.
- abstract method : 선언부만 있고 body가 없는 메소드
- @abstractmethod를 선언해야한다.
- 일반 클래스에는 추상메소드가 존재해서는 안된다, 하지만 추상클래스는 일반메소드, 추상메소드 존재해도 된다.

 

추상클래스는 최소한의 메소드를 작성해야할때 추상메소드를 사용하여 내용이존재하지않는 메소드를 생성한다. (샘플)
그래서 자식클래스가 메소드의 body부분을 작성해야한다.(오버라이드)

보통 회사에서 최소한의 기능을 추가하기위해 팀원들에게 내용이 존재하지않는 추상메소드를  생성하고, 팀원들에게 자식클래스로 상속하여 추상메소드의 기능을 추가하라고 지시한다.

 

from abc import ABC, abstractmethod, ABCmeta

class Base1(metaclass=ABC):
#class Base1(ABC): 이렇게도 가능
    @abstractmethod
    def study(self):   # 선언부는 있는데 body가 없다.
        pass           
    @abstractmethod
    def go(self):       
        pass

class Base2(Base1):
    # 기본생성자(생략)
    def wakeup(self):
        print("일어납니다")
    
Base2() # 객체생성

위의 코드는 현재 자식클래스에서 추상메소드를 오버라이딩하지않았다. 그랬더니 결과가 오류가 나왔다.

 #TypeError: Can't instantiate abstract class Base2 with abstract methods go, study

추상메소드인 go와 study를 선언하지않아 오류가 뜬것이다.

 

from abc import ABC, abstractmethod, ABCMeta

class Base1(metaclass=ABCMeta):
#class Base1(ABC): 이렇게도 가능
    @abstractmethod
    def study(self):   # 선언부는 있는데 body가 없다.
        pass           
    @abstractmethod
    def go(self):       
        pass

class Base2(Base1):
    # 기본생성자(생략)
    def wakeup(self):
        print("일어납니다")
    def study(self):         # 부모의 추상메소드 오버라이딩
        print("공부합니다")  
    def go(self):            # 부모의 추상메소드 오버라이딩
        print("학교갑니다") 
    
base=Base2()
base.study()
base.go()

"""결과
공부합니다
학교갑니다
"""

위 코드처럼 study와 go 추상메소드를 오버라이딩하여 정의했을시 오류가나지않고 함수결과도 잘나오는것을 알 수 있다.

추상클래스를 상속받는 자식클래스(일반 클래스)에서 반드시 부모클래스의 추상메소드를 오버라이딩해야한다.

 

 

 

 

728x90
반응형