[파이썬] 인터페이스 분리 원칙과 인터페이스

인터페이스 분리 원칙 (Interface Segregation Principle, ISP)은 소프트웨어 디자인 원칙 중 하나로, 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야 한다는 원칙입니다. 이를테면, 클라이언트는 자신이 필요로 하는 기능에만 의존하고, 필요하지 않은 기능에는 의존하지 않아야 합니다. 이는 인터페이스 설계에 있어 나타날 수 있는 결합도와 유연성의 문제를 해결하기 위한 원칙입니다.

Python에서 이 원칙을 적용하기 위해 인터페이스가 어떻게 작동하는지 이해해야 합니다. Python은 명시적인 인터페이스 선언이 없는 동적 언어이기 때문에 다른 몇몇 프로그래밍 언어와는 다른 방식으로 인터페이스를 구현합니다. Python에서는 추상 베이스 클래스(ABC, Abstract Base Class)를 사용하여 인터페이스를 정의합니다. ABC는 추상 메서드를 정의하고, 해당 메서드를 하위 클래스에서 구현하도록 강제합니다.

다음은 인터페이스 분리 원칙을 따르는 Python 코드의 예제입니다.

from abc import ABC, abstractmethod

# 동물 인터페이스
class Animal(ABC):
    @abstractmethod
    def speak(self):
        pass

# 행동 인터페이스
class Behavior(ABC):
    @abstractmethod
    def eat(self):
        pass

    @abstractmethod
    def sleep(self):
        pass

# 강아지 클래스
class Dog(Animal, Behavior):
    def speak(self):
        return "Woof!"

    def eat(self):
        return "Eating dog food"

    def sleep(self):
        return "Zzzzz"

# 고양이 클래스
class Cat(Animal, Behavior):
    def speak(self):
        return "Meow!"

    def eat(self):
        return "Eating cat food"

    def sleep(self):
        return "Zzzzz"

# 동물과 행동을 사용하는 클라이언트 클래스
class AnimalClient:
    def __init__(self, animal):
        self.animal = animal

    def do_speak(self):
        return self.animal.speak()

    def do_eat(self):
        return self.animal.eat()

    def do_sleep(self):
        return self.animal.sleep()

# 프로그램 실행
dog = Dog()
cat = Cat()

dog_client = AnimalClient(dog)
print(dog_client.do_speak())  # Output: Woof!
print(dog_client.do_eat())    # Output: Eating dog food
print(dog_client.do_sleep())  # Output: Zzzzz

cat_client = AnimalClient(cat)
print(cat_client.do_speak())  # Output: Meow!
print(cat_client.do_eat())    # Output: Eating cat food
print(cat_client.do_sleep())  # Output: Zzzzz

위의 코드에서는 Animal 클래스와 Behavior 클래스로 인터페이스를 정의하고, Dog 클래스와 Cat 클래스에서 이 인터페이스를 구현합니다. AnimalClient 클래스는 AnimalBehavior 인터페이스를 사용하여 동물의 동작을 처리합니다. 이렇게 함으로써 각 동물은 자신이 필요로 하는 인터페이스에만 의존하고, 필요 없는 인터페이스에는 의존하지 않게 됩니다.

이것은 인터페이스 분리 원칙을 따르는 좋은 예입니다. 클라이언트는 자신이 필요한 기능에만 의존하며, 다른 기능에는 의존하지 않으므로 수정이 필요한 경우에도 영향을 최소화할 수 있습니다. 또한, 추상 베이스 클래스를 사용하여 코드의 가독성과 유지 관리를 향상시킬 수 있습니다.