파이썬의 추상 클래스

파이썬의 추상 클래스

이 글은 파이썬의 추상 클래스에 대해 설명합니다.

abc 모듈을 사용하여 추상 클래스의 기본 메커니즘을 설명하고, 실용적인 예제를 제공하며, 관련 코드를 통해 상세히 설명하겠습니다.

YouTube Video

파이썬의 추상 클래스

파이썬의 abc 모듈(추상 기본 클래스)은 표준 라이브러리의 일부로, 클래스가 구현해야 할 메서드의 템플릿을 제공하여 추상 클래스를 정의하는 데 사용됩니다. 이 모듈을 사용하면 클래스 설계의 유연성과 견고성이 향상됩니다.

추상 클래스란 무엇인가요?

추상 클래스는 구체적인(인스턴스화 가능한) 클래스에 공통 인터페이스를 정의하는 데 사용되는 클래스입니다. 추상 클래스는 자체적으로 인스턴스화될 수 없으며, 파생(하위) 클래스에서 구체적인 구현이 제공되어야 합니다.

abc 모듈은 추상 메서드나 속성을 정의하고 이를 상속받는 클래스에서 구현하도록 강제할 수 있게 해줍니다. 추상 메서드가 하나라도 구현되지 않으면 클래스는 인스턴스화될 수 없습니다.

abc 모듈의 사용법

abc 모듈을 사용하여 추상 클래스를 생성하려면 ABC 클래스를 상속받고 @abstractmethod 데코레이터를 사용하여 추상 메서드를 정의합니다.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"

여기에서 Animal 클래스는 추상 클래스로 정의되며, sound라는 추상 메서드를 포함합니다. 이 메서드는 하위 클래스에서 구체적으로 구현되어야 합니다. DogCatAnimal을 상속받아 각각 sound 메서드를 구현합니다.

추상 클래스의 인스턴스화

추상 클래스는 직접 인스턴스화될 수 없습니다. 예를 들어, Animal 클래스를 직접 인스턴스화하려고 하면 오류가 발생합니다.

1animal = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods sound
  • 추상 클래스를 인스턴스화하려고 하면, 파이썬은 구현되지 않은 추상 메서드가 있다고 판단하여 TypeError를 발생시킵니다. 하위 클래스에서 모든 필수 추상 메서드가 구현되면, 인스턴스화가 가능해집니다.

다중 추상 메서드

클래스에 여러 개의 추상 메서드가 포함될 수도 있습니다. 모든 추상 메서드가 하위 클래스에서 구현되지 않으면, 그 클래스는 여전히 추상 클래스 상태로 유지됩니다.

 1from abc import ABC, abstractmethod
 2
 3class Vehicle(ABC):
 4
 5    @abstractmethod
 6    def start_engine(self):
 7        pass
 8
 9    @abstractmethod
10    def stop_engine(self):
11        pass
12
13class Car(Vehicle):
14    def start_engine(self):
15        return "Car engine started"
16
17    def stop_engine(self):
18        return "Car engine stopped"

이 예제에서 Vehicle 클래스는 두 개의 추상 메서드를 가지고 있으며, Car 클래스는 두 메서드를 모두 구현한 후에만 인스턴스화할 수 있습니다.

추상 속성 정의하기

abc 모듈은 추상 메서드뿐만 아니라 추상 속성도 지원합니다. 이를 통해 파생 클래스에서 속성 구현을 강제할 수 있습니다.

 1from abc import ABC, abstractmethod
 2
 3class Shape(ABC):
 4
 5    @property
 6    @abstractmethod
 7    def area(self):
 8        pass
 9
10class Circle(Shape):
11    def __init__(self, radius):
12        self.radius = radius
13
14    @property
15    def area(self):
16        return 3.14159 * (self.radius ** 2)
  • 이 예제에서 Shape 클래스는 추상 속성 area를 가지고 있으며, 하위 클래스인 Circle은 이 속성을 구체화합니다. 이와 같이 추상 클래스를 사용하여 속성 구현을 강제하면 코드의 일관성을 유지하는 데 도움이 됩니다.

isinstance()issubclass() 사용하기

추상 클래스를 사용하여 isinstance() 또는 issubclass()로 클래스 상속 관계를 확인할 수 있으며, 이를 통해 코드의 안전성과 유연성을 높일 수 있습니다.

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"
18
19class Vehicle(ABC):
20
21    @abstractmethod
22    def start_engine(self):
23        pass
24
25    @abstractmethod
26    def stop_engine(self):
27        pass
28
29class Car(Vehicle):
30    def start_engine(self):
31        return "Car engine started"
32
33    def stop_engine(self):
34        return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal))   # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal))  # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle))  # False

isinstance()는 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용되며, issubclass()는 클래스가 특정 클래스의 하위 클래스인지 확인하는 데 사용됩니다.

요약

abc 모듈을 사용하여 추상 클래스를 설계하면 클래스 간 인터페이스를 명확히 하고 필수 메서드와 속성의 구현을 강제할 수 있습니다. 이는 코드의 일관성을 유지하고 오류를 줄이는 데 도움이 되며, 특히 대규모 프로젝트에서 유용합니다.

추상 클래스는 Python에서 유연한 객체 지향 프로그래밍을 지원하고 클래스의 재사용성과 유지보수성을 향상시키는 중요한 도구입니다.

위의 기사를 보면서 Visual Studio Code를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.

YouTube Video