Abstract method (추상 메서드)
파이썬의 class를 공부하다 보면 정적메서드, 클래스메서드, 추상메서드를 볼 수 있다.
추상 메서드?
이것이 무엇인지 한번 알아보도록 하겠다.
추상메서드는 한 class를 만들때 꼭 있어야하는 method를 관리하기 위한 목적으로 사용할 수 있다.
쓰는 용도를 예를 들면 사람이라는 class를 만든다면, 그안에는 먹는다는 method와 일한다는 method가 꼭 있어야 한다. (일은...뭐..선택적일 수 있지만...ㅋㅋ)
또 다른 예는 어떤 기기를 켰을때 꼭 로고가 나오거나 소리가 나오게 해야하는 method를 만들어야한다. 이때 실수로 로고가 나오거나 소리가 나오게 하는 method를 class안에 넣지 않으면 큰(?) 일이 나게 된다.
이런 것을 막기 위한 용도로 추상클래스를 만들어 두고, 이 추상클래스를 실제 서비스할 클래스가 상속받게 만들어 꼭 만들어야 하는 method를 만들 수 있게 하는 일종의 체크리스트 관리같은 개념이라 보면 된다.
코드를 통해 확인해 보면
from abc import *
class HumanBase(metaclass=ABCMeta):
@abstractmethod
def eat(self):
pass
@abstractmethod
def work(self):
pass
class Human(HumanBase):
def __init__(self,name,*args):
self.name = name
print('나의 이름은 {}이다'.format(name))
def eat(self, food):
print('{}는 {}를 먹는다'.format(self.name,food))
a = Human('바나나')
a.eat('사과')
위 코드 처럼 abc(abstract base class)에서 metaclass=ABCMeta
를 불러와 추상클래스를 만들어 준다.
위 추상 클래스에서 선언한 두개의 eat, work 메서드가 Human class의 method에 모두 작성되지 않았으므로
아래와 같은 에러가 나타난다.
이것을 해결하기 위해 추상클래스에서 선언된 메서드를 모두 쓸 수 있도록 Human class의 method를
다음과 같이 코딩해주면!!!
from abc import *
class HumanBase(metaclass=ABCMeta):
@abstractmethod
def eat(self):
pass
@abstractmethod
def work(self):
pass
class Human(HumanBase):
def __init__(self,name,*args):
self.name = name
print('나의 이름은 {}이다'.format(name))
def eat(self, food):
print('{}는 {}를 먹는다'.format(self.name,food))
def work(self,job):
print('{}는 {}이란 일을 한다'.format(self.name,job))
a = Human('바나나')
a.eat('사과')
a.work('프로그래머')
나의 이름은 바나나이다
바나나는 사과를 먹는다
바나나는 프로그래머이란 일을 한다
아주 자~알 실행이 된다.
프로젝트를 할 때 추상클래스를 적절히 활용해보자!!!
추상클래스의 method는 빈 메서드로 만들 것!!!
---> 추상 클래스는 인스턴스를 만들 수 없으니 추상 메서드도 호출할 일이 없기 때문(feat.코딩도장)