[파이썬] 행위 패턴의 종류와 사용법

행위 패턴은 소프트웨어 디자인 패턴의 한 종류로, 객체 간의 상호작용을 구조화하는 방법을 제공합니다. 행위 패턴은 각 객체의 역할과 책임을 분리하여 유연하고 재사용 가능한 코드를 작성하는 데 도움을 줍니다.

이번 글에서는 행위 패턴의 종류와 각각의 사용법을 파이썬 예제 코드와 함께 알아보겠습니다.

1. 단일체 (Singleton) 패턴

단일체 패턴은 오직 하나의 인스턴스만 생성하여 그 인스턴스를 공유하고자 할 때 사용하는 패턴입니다. 이는 전역 변수 사용을 통해 구현될 수 있지만, 단일체 패턴을 사용하면 클래스 내부에서 인스턴스 생성과 관리를 담당하므로 전역 변수의 단점을 방지할 수 있습니다.

class Singleton:
    _instance = None
    
    @staticmethod
    def get_instance():
        if not Singleton._instance:
            Singleton._instance = Singleton()
        return Singleton._instance

# 사용 예시
instance1 = Singleton.get_instance()
instance2 = Singleton.get_instance()

print(instance1 is instance2)  # True

2. 전략 (Strategy) 패턴

전략 패턴은 알고리즘을 독립적으로 캡슐화하여 동적으로 바꿀 수 있는 패턴입니다. 이는 객체가 실행 시점에 알고리즘을 선택할 수 있게 하여 유연성을 제공합니다.

class Strategy:
    def execute(self):
        pass

class StrategyA(Strategy):
    def execute(self):
        print("Executing strategy A")

class StrategyB(Strategy):
    def execute(self):
        print("Executing strategy B")

# 사용 예시
strategy_a = StrategyA()
strategy_b = StrategyB()

strategy_a.execute()  # Executing strategy A
strategy_b.execute()  # Executing strategy B

3. 옵서버 (Observer) 패턴

옵서버 패턴은 객체 간의 일대다 의존 관계를 구축하여 한 객체의 상태 변화에 따라 다른 객체들이 자동으로 갱신될 수 있게 하는 패턴입니다. 이는 이벤트 처리나 MVC (모델-뷰-컨트롤러) 패턴에서 자주 사용됩니다.

class Observer:
    def notify(self, event):
        pass

class Subject:
    def __init__(self):
        self.observers = []

    def attach(self, observer):
        self.observers.append(observer)

    def detach(self, observer):
        self.observers.remove(observer)

    def notify_observers(self, event):
        for observer in self.observers:
            observer.notify(event)

# 사용 예시
class EventObserver(Observer):
    def notify(self, event):
        print("Event occurred:", event)

subject = Subject()
observer = EventObserver()

subject.attach(observer)
subject.notify_observers("Something happened")  # Event occurred: Something happened
subject.detach(observer)

마무리

이 글에서는 행위 패턴의 종류와 사용법에 대해 알아보았습니다. 각각의 패턴은 여러 상황에서 유용하게 사용될 수 있으며, 코드의 유연성과 재사용성을 높일 수 있습니다.

더 많은 행위 패턴과 해당 사용법에 대해 학습하고 실제 프로젝트에 적용해보는 것을 추천합니다.