추상클래스(abstarct class)란?
- 추상클래스란 미구현 추상메소드를 한개 이상 가지며, 자식클래스에서 해당 추상 메소드를 반드시 구현하도록 강제한다.
- 상속받은 클래스는 추상메소드를 구현하지 않아도 import할 때까지 에러는 발생하지 않으나 객체를 생성할 시 에러가 발생한다.
- 추상클래스를 만들기 위한 형식은 아래와 같다
- 반드시
abc
모듈을 import 해야한다.
- 추상메소드는
생략하면
기본적인 클래스 기능은 동작합니다만, 추상메소드를 추가한 후에는 객체를 생성하면 에러가 발생한다.
- 추상 클래스는 인스턴스를 생성할 수 없다.
- 자식 클래스들이 각각의 독립된 공통적인 기능을 갖출때 사용한다.
- 각각의 독립된 공통적인 기능이 값을 공유하면 안되므로 구현하지 않은 빈 메소드를 사용한다. (아래 코드 처럼)
from abc import *
class MyClass(metaclass=ABCMeta):
@abstractmethod
def run(self):
pass
추상클래스(abstract class)사용
- abc 모듈을 가져온다. (abc모듈은 abstract base class 약자이고 기본적으로 파이썬에 들어있다.) abc모듈을 가져온 후 사용할 추상 클래스 명의 옆에 (metaclass=ABCMeta)를 적어주고, 메소드 위에 @abstractmethod를 적어서 추상 메소드임을 정의 해준다.
from abc import *
class AbstractCountry(metaclass=ABCMeta):
name = '국가명'
population = '인구'
capital = '수도'
def show(self):
print('국가 클래스의 메소드이다.')
class Korea(AbstractCountry):
def __init__(self, name, population, capital):
self.name = name
self.population = population
self.capital = capital
def show_name(self):
print('국가 이름은 : ', self.name)
- 위의 코드에서 추상메소드를 작성하지 않았다.
- 하지만 추상클래스라 할지라도 기본적인 클래스 기능은 동작한다. (추상메소드를 작성하지 않았기 때문에)
- 상속한 객체도 생성 가능
from abstract import *
a = AbstractCountry()
a.show() # 국가 클래스의 메소드이다.
b = Korea('대한민국', 50000000, '서울')
b.show_name() # 국가 이름은 : 대한민국
AbstractCountry
클래스에 추상메소드를 추가한다.
- 참고로 자식 클래스에서 기능을 구현하기 위해 추상 메소드는
pass
를 사용하여 빈 메소드
로 해준다.
- 아래의 코드는 추상메서드를 선언한 함수가 잘 출력되는지 확인해보기 위해 print를 썻다.
class AbstractCountry(metaclass=ABCMeta):
...
@abstractmethod
def show_capital(self):
print('국가의 수도는?')
- 다시 REPL에서 상속받은
Korea 클래스
객체를 생성해본다.
객체 생성시에 에러가 발생한다.
- Korea 클래스에서 상속받은 추상메소드를 구현해본다.
class Korea(AbstractCountry):
def show_capital(self):
super().show_capital()
print(self.capital)
from abstract import *
a = Korea('대한민국', 5000000, '서울')
a.show_capital() # 국가의 수도는? <br> 서울
- 추상 메서드를 추가하고 객체를 생성하면 에러발생함