본문 바로가기

python

python 추상 클래스(abstract class)

추상클래스(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> 서울
  • 추상 메서드를 추가하고 객체를 생성하면 에러발생함