추상 메서드와 인터페이스는 객체지향 프로그래밍에서 중요한 개념입니다. 추상 메서드는 클래스에 선언되지만 구현되지 않는 메서드이며, 인터페이스는 추상 메서드의 집합으로 이루어진 것입니다. Python은 명시적으로 추상 메서드나 인터페이스를 정의할 수 있는 언어는 아니지만, 추상 메서드와 인터페이스의 개념을 활용할 수 있는 방법이 있습니다.
추상 메서드
추상 메서드는 하위 클래스에서 반드시 구현되어야 하는 메서드입니다. 그리고 추상 메서드는 ABC
(Abstract Base Class) 클래스를 상속받아 선언할 수 있습니다. 추상 메서드는 @abstractmethod
데코레이터와 함께 사용합니다.
from abc import ABC, abstractmethod
class AbstractClass(ABC):
@abstractmethod
def some_method(self):
pass
위의 예제에서 AbstractClass
는 추상 클래스로, 추상 메서드 some_method
를 갖습니다. some_method
는 구현되지 않고 pass
가 작성되어 있습니다. 이 추상 메서드는 상속받은 클래스에서 구현되어야 합니다. 만약 하위 클래스에서 추상 메서드를 구현하지 않으면 TypeError
가 발생합니다.
인터페이스
인터페이스는 클래스가 어떤 메서드를 구현해야 하는지 정의하는 것입니다. Python은 명시적으로 인터페이스를 정의하는 문법이 없지만, 추상 클래스와 추상 메서드를 사용해 인터페이스를 모방할 수 있습니다. 인터페이스는 여러 추상 메서드로 이루어집니다.
from abc import ABC, abstractmethod
class Interface(ABC):
@abstractmethod
def method1(self):
pass
@abstractmethod
def method2(self):
pass
위의 예제에서 Interface
는 인터페이스로, method1
과 method2
라는 추상 메서드를 갖습니다. 이 추상 메서드를 구현하는 클래스는 인터페이스를 준수하는 것으로 간주됩니다.
추상 클래스와 인터페이스 활용하기
추상 클래스와 인터페이스를 활용하는 예제를 살펴봅시다. 아래는 추상 클래스 Animal
과 인터페이스 Swimable
을 정의한 후 이를 구현한 클래스 Dog
와 Fish
를 만드는 예제입니다.
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def sound(self):
pass
class Swimable(ABC):
@abstractmethod
def swim(self):
pass
class Dog(Animal, Swimable):
def sound(self):
return "Bark"
def swim(self):
return "Swim"
class Fish(Animal, Swimable):
def sound(self):
return "Blub"
def swim(self):
return "Swim"
# 각 클래스의 인스턴스 생성
dog = Dog()
fish = Fish()
# 추상 메서드 호출
print(dog.sound()) # Output: Bark
print(fish.sound()) # Output: Blub
# 인터페이스의 메서드 호출
print(dog.swim()) # Output: Swim
print(fish.swim()) # Output: Swim
추상 클래스 Animal
과 Swimable
은 각각 Dog
와 Fish
에 상속되고, 추상 메서드를 구현합니다. 이렇게 함으로써 Dog
와 Fish
는 Animal
의 추상 메서드와 Swimable
의 추상 메서드를 모두 구현하게 됩니다.
위의 예제에서 Dog
와 Fish
클래스의 sound
메서드는 구현되어 있으므로 인스턴스를 생성하고 호출할 수 있습니다. 또한, Dog
와 Fish
클래스 모두 swim
메서드를 구현하였으므로 인터페이스의 메서드를 호출할 수 있습니다.
추상 메서드와 인터페이스는 코드의 유연성과 재사용성을 높여주는 중요한 프로그래밍 개념입니다. Python에서는 명시적으로 추상 메서드와 인터페이스를 정의하는 기능은 없지만, ABC
클래스와 abstractmethod
데코레이터를 활용하여 이 개념들을 구현할 수 있습니다.