[파이썬] 구조 패턴의 종류와 사용법

구조 패턴은 소프트웨어 개발에서 사용되는 중요한 디자인 패턴의 일종입니다. 이러한 패턴은 소프트웨어의 구조와 관련된 문제를 해결하기 위해 사용되며, 코드의 재사용성, 유지보수성, 확장성을 향상시키는데 도움을 줍니다. 이번 블로그 포스트에서는 몇 가지 흔히 사용되는 구조 패턴에 대해 살펴보고, 간단한 Python 예제를 통해 사용법을 알아보겠습니다.

1. 어댑터 패턴 (Adapter Pattern)

어댑터 패턴은 호환되지 않는 두 개의 클래스를 연결하는 역할을 합니다. 예를 들어, 외부 라이브러리나 서드파티 API를 사용하는데에는 호환성 문제가 발생할 수 있습니다. 이런 경우, 어댑터 클래스를 이용하여 두 클래스 간에 호환성을 제공할 수 있습니다.

class Target:
    def request(self):
        print("Target request")

class Adaptee:
    def specific_request(self):
        print("Adaptee specific request")

class Adapter(Target):
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def request(self):
        self.adaptee.specific_request()

# 사용 예시
adaptee = Adaptee()
adapter = Adapter(adaptee)
adapter.request()

2. 데코레이터 패턴 (Decorator Pattern)

데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가하기 위해 사용됩니다. 이 패턴은 기존 객체를 감싸는 래퍼 클래스를 생성하여, 기존 객체에 있는 메소드를 호출하면서 새로운 동작을 추가할 수 있습니다.

class Component:
    def operation(self):
        print("Component operation")

class Decorator(Component):
    def __init__(self, component):
        self.component = component

    def operation(self):
        self.component.operation()

class ConcreteComponent(Component):
    def operation(self):
        print("ConcreteComponent operation")

# 사용 예시
component = ConcreteComponent()
decorator = Decorator(component)
decorator.operation()

3. 컴포지트 패턴 (Composite Pattern)

컴포지트 패턴은 객체들을 트리 구조로 구성하여, 개별 객체와 그 객체들을 그룹으로 다룰 수 있도록 해줍니다. 이 패턴은 객체들 간에 일관된 방식으로 작업을 수행할 수 있는 유연한 구조를 제공합니다.

class Component:
    def operation(self):
        pass

class Composite(Component):
    def __init__(self):
        self.components = []

    def add(self, component):
        self.components.append(component)

    def operation(self):
        for component in self.components:
            component.operation()

class Leaf(Component):
    def operation(self):
        print("Leaf operation")

# 사용 예시
composite = Composite()
composite.add(Leaf())
composite.add(Leaf())
composite.operation()

위에서 소개한 어댑터, 데코레이터, 컴포지트 패턴은 구조 패턴 중 몇 가지만 소개한 것이고, 더 많은 패턴들이 존재합니다. 이러한 패턴을 적절히 활용하여 소프트웨어의 구조를 설계하면, 유지보수성이 높고 확장성 있는 코드를 작성할 수 있습니다.