[파이썬] 추상 메서드와 인터페이스

추상 메서드와 인터페이스는 객체지향 프로그래밍에서 중요한 개념입니다. 추상 메서드는 클래스에 선언되지만 구현되지 않는 메서드이며, 인터페이스는 추상 메서드의 집합으로 이루어진 것입니다. 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는 인터페이스로, method1method2라는 추상 메서드를 갖습니다. 이 추상 메서드를 구현하는 클래스는 인터페이스를 준수하는 것으로 간주됩니다.

추상 클래스와 인터페이스 활용하기

추상 클래스와 인터페이스를 활용하는 예제를 살펴봅시다. 아래는 추상 클래스 Animal과 인터페이스 Swimable을 정의한 후 이를 구현한 클래스 DogFish를 만드는 예제입니다.

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

추상 클래스 AnimalSwimable은 각각 DogFish에 상속되고, 추상 메서드를 구현합니다. 이렇게 함으로써 DogFishAnimal의 추상 메서드와 Swimable의 추상 메서드를 모두 구현하게 됩니다.

위의 예제에서 DogFish 클래스의 sound 메서드는 구현되어 있으므로 인스턴스를 생성하고 호출할 수 있습니다. 또한, DogFish 클래스 모두 swim 메서드를 구현하였으므로 인터페이스의 메서드를 호출할 수 있습니다.

추상 메서드와 인터페이스는 코드의 유연성과 재사용성을 높여주는 중요한 프로그래밍 개념입니다. Python에서는 명시적으로 추상 메서드와 인터페이스를 정의하는 기능은 없지만, ABC 클래스와 abstractmethod 데코레이터를 활용하여 이 개념들을 구현할 수 있습니다.