[파이썬] 어댑터 패턴과 인터페이스 변환

어댑터 패턴과 인터페이스 변환은 소프트웨어 개발에서 중요한 개념입니다. 이들을 사용하면 기존의 인터페이스를 다른 형식으로 변환하거나, 호환되지 않는 인터페이스를 상호 작용할 수 있는 형식으로 변환할 수 있습니다. 이 글에서는 파이썬에서 어댑터 패턴과 인터페이스 변환을 어떻게 구현하는지 알아보겠습니다.

어댑터 패턴

어댑터 패턴은 호환되지 않는 인터페이스를 가진 객체들을 함께 작동할 수 있게 만들어주는 구조적인 패턴입니다. 이 패턴은 중간에 어댑터 객체를 추가하여 기존의 인터페이스를 필요로하는 객체들이 호환되지 않는 인터페이스를 사용할 수 있도록 합니다.

예시

# Adaptee(호환되지 않는 인터페이스를 가진 객체)
class Adaptee:
    def specific_method(self):
        # 호환되지 않는 특정한 동작 수행
        pass

# Target(기대하는 인터페이스)
class Target:
    def target_method(self):
        # 기대하는 동작 수행
        pass

# Adapter(인터페이스를 변환하는 객체)
class Adapter(Target):
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def target_method(self):
        self.adaptee.specific_method()

위의 예시에서 Adaptee는 호환되지 않는 인터페이스를 가지고 있고, Target은 기대하는 인터페이스를 가지고 있습니다. AdapterTarget 인터페이스를 구현하면서 Adaptee의 인스턴스를 감싸기 때문에 호환되지 않는 인터페이스를 가진 Adaptee 객체를 Target 인터페이스를 가진 객체들과 함께 사용할 수 있게 됩니다.

인터페이스 변환

인터페이스 변환은 객체 간 상호 작용을 위해 인터페이스를 변환하는 과정입니다. 이는 호환되지 않는 인터페이스를 원하는 인터페이스로 변환하거나, 이미 존재하는 인터페이스를 다른 형식으로 변환할 때 사용됩니다. 파이썬에서는 다형성을 통해 인터페이스 변환이 용이하게 구현될 수 있습니다.

예시

# 기존 인터페이스
class Interface:
    def method(self):
        pass

# 원하는 인터페이스
class DesiredInterface:
    def desired_method(self):
        pass

# 인터페이스 변환
class Adapter(DesiredInterface):
    def __init__(self, interface):
        self.interface = interface

    def desired_method(self):
        self.interface.method()

# 기존 인터페이스를 사용하는 객체
class OriginalObject:
    def method(self):
        # 기존의 동작 수행
        pass

# 인터페이스 변환을 통해 사용하는 객체
original_object = OriginalObject()
adapter = Adapter(original_object)

adapter.desired_method()

위의 예시에서 Interface는 기존의 인터페이스를 나타내고, DesiredInterface는 원하는 인터페이스를 나타냅니다. 이 두 인터페이스를 연결하는 역할을 하는 것이 Adapter입니다. AdapterDesiredInterface를 구현하면서 Interface의 인스턴스를 감싸기 때문에 기존 인터페이스를 원하는 인터페이스로 변환할 수 있습니다.

마무리

어댑터 패턴과 인터페이스 변환은 객체 간의 호환성을 높이고 유연성을 확보하기 위한 중요한 개념입니다. 이를 통해 기존의 코드를 수정하지 않고도 다른 인터페이스를 사용할 수 있게 되며, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.

파이썬은 다형성을 지원하고 동적 타이핑이 가능하기 때문에 어댑터 패턴과 인터페이스 변환을 쉽게 구현할 수 있습니다. 유지보수 가능하고 확장 가능한 코드를 작성하기 위해 이러한 개념을 적절하게 활용하는 것이 중요합니다.

참고: Python Design Patterns - Adapter Pattern