본문 바로가기
[Language] - Python

#4. 추상 클래스 (Abstract Class)

by Bebsae 2020. 12. 28.

디자인 패턴을 공부하면서 구체화 되어 있는 것 보다 고수준이든 저수준이든 추상화된 것에 의존하라는 원칙을 알게 되었다. 그러나 대부분의 디자인 패턴 포스트를 확인해보면 자바로 설명이 자주 쓰여있어서 필자는 파이썬에 추상 클래스가 없는지 궁금했다. 그리고 오늘도 열심히 서칭과 뜨거운 밤을 보내고 있다.

 

그리고 파이썬에도 추상 클래스가 있다는 사실!.. 그러나 기본적으로 제공되는 것은 아니다. 역시나 import를 해야한다는 사실.. 그래도 있다는 것에 감사하고 열심히 포스팅을 해보려 한다.

 

일단 필자가 생각하는 추상 클래스의 필요성에 대해 말을 해보자면..

1. 특정 개념을 추상화 및 일반화하는데에 유리하고,

2. 추상 클래스에 속해 있는 추상 메소드는 반드시 구현(오버라이딩)을 해야하므로 만약에 무조건 오버라이딩을 하지 않으면 작동하지 않도록 하기 위한 의도가 있다면 다른 개발자가 해당 추상 클래스를 사용할 때 추상 메소드를 구현하지 않고 넘어가는 실수를 방지할 수 있다는 점이다.

 

다른 의견이나 틀린점이 있다면 언제든지 지적해주어도 좋다..

 

from abc import *

class 클래스명(metaclass=ABCMeta):
    @abstractmethod
    def 메소드명(self):
        pass

 

여기서 abc의 의미는 (abstract class)의 약자이다. 그리고 위에서 언급한대로 추상 메소드는 반드시 비어있다. 왜냐하면 추상 클래스는 인스턴스화 시키기 위한 것이 아니기 때문이다. 반드시 상속을 받고 구현을 해야한다.

 

예시를 들어보겠다.

 

from abc import *

class Device(metaclass=ABCMeta):
    @abstractmethod
    def get_device_info(self):
        pass
        
    @abstractmethod
    def send_device_info(self):
        pass
import requests

class Printer(Device)
    def __init__(self):
        self.url = ....

    def get_device_info(self):
        return type(self)
        
    def send_device_info(self):
        info = {'info': self.get_device_info}
        requests.post(self.url, json=info)

여기서 중요한 점은 반드시 추상 메소드(get_device_info, send_device_info)는 하나도 빠지지 않고 구현해야 한다는 점이다. 

'[Language] - Python' 카테고리의 다른 글

#6. property 데코레이터  (8) 2021.02.02
#5. 덕 타이핑 (Duck Typing)  (2) 2020.12.29
#3. pickle 모듈  (0) 2020.12.18
#2. 접근제한자 (Access Modifier)  (0) 2020.12.14
#1. staticmethod, classmethod, instancemethod  (0) 2020.12.09

댓글