[파이썬] 옵서버 패턴과 객체 상태 감시

옵서버 패턴(observer pattern)은 소프트웨어 개발에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 객체들 간의 의존성을 최소화하고, 객체의 상태 변화를 관찰하고 감지하는데 사용됩니다. 이번 포스트에서는 옵서버 패턴을 사용하여 객체 상태 감시를 구현하는 방법을 알아보겠습니다.

옵서버 패턴 개요

옵서버 패턴은 주로 객체들 간의 일대다 관계를 구현할 때 사용됩니다. 한 객체가 변화하면, 이를 감시하고 있는 다른 객체들에게 자동으로 알림을 보내게 됩니다. 이를 통해 객체들 사이의 결합도를 낮출 수 있고, 객체 간의 상호작용을 유연하게 만들어줍니다.

이 패턴은 주로 이벤트 기반 시스템에서 자주 사용됩니다. 예를 들어, GUI 프로그램에서는 버튼이 클릭되었을 때, 이를 감시하는 다른 객체들이 알림을 받고 특정 동작을 수행하도록 할 수 있습니다.

예제: 주식 시장 옵서버 시스템

이제 실제로 옵서버 패턴을 사용하여 객체 상태 감시 시스템을 구현해보겠습니다. 예를 들어, 주식 시장에서 주식 가격 변동을 감시하는 시스템을 만들어보겠습니다.

주식 객체

먼저, 주식을 나타내는 Stock 클래스를 구현해보겠습니다.

class Stock:
    def __init__(self, symbol, price):
        self.symbol = symbol
        self.price = price
        self.observers = []
        
    def attach(self, observer):
        self.observers.append(observer)
        
    def detach(self, observer):
        self.observers.remove(observer)
        
    def notify(self):
        for observer in self.observers:
            observer.update(self)
    
    def set_price(self, price):
        self.price = price
        self.notify()

위 코드에서는 Stock 클래스에 attach, detach, notify 메서드를 추가하여 옵서버 패턴을 구현하였습니다. attach 메서드는 옵서버를 등록하는 역할을 수행하고, detach 메서드는 옵서버를 제거하는 역할을 수행합니다. notify 메서드는 등록된 옵서버들에게 알림을 보내는 역할을 수행합니다. 마지막으로, set_price 메서드는 주식 가격을 설정하고, notify 메서드를 호출하여 옵서버들에게 알림을 보냅니다.

주식 가격 출력하는 Observer 클래스

이제 실제로 주식 가격을 출력하는 Observer 클래스를 구현해보겠습니다.

class PriceObserver:
    def __init__(self, name):
        self.name = name
    
    def update(self, stock):
        print(f"{self.name}: {stock.symbol} 주식 가격 변동 - {stock.price}")

위 코드에서는 PriceObserver 클래스를 구현하였습니다. 이 클래스는 주식 가격 변동을 감시하여 출력합니다. 주식 객체의 update 메서드가 호출될 때마다 주식 가격 변동을 출력하도록 구현하였습니다.

실행 결과

이제 주식 객체와 옵서버 객체를 생성해보고, 주식 가격이 변동될 때마다 옵서버에게 알림을 보내는 예제를 실행해보겠습니다.

stock1 = Stock("AAPL", 100.0)
stock2 = Stock("GOOG", 200.0)

observer1 = PriceObserver("Observer 1")
observer2 = PriceObserver("Observer 2")

stock1.attach(observer1)
stock1.attach(observer2)
stock2.attach(observer2)

stock1.set_price(150.0)
stock2.set_price(250.0)

stock1.detach(observer2)

stock1.set_price(200.0)

위 코드에서는 AAPL 주식과 GOOG 주식 객체를 생성하고, 두 개의 옵서버 객체를 생성한 후에 주식 객체에 옵서버를 등록하고 호출하는 코드를 작성하였습니다.

실행 결과는 다음과 같이 출력될 것입니다:

Observer 1: AAPL 주식 가격 변동 - 150.0
Observer 2: AAPL 주식 가격 변동 - 150.0
Observer 2: GOOG 주식 가격 변동 - 250.0
Observer 1: AAPL 주식 가격 변동 - 200.0

요약

이번 포스트에서는 옵서버 패턴을 사용하여 객체 상태 감시를 구현하는 방법을 알아보았습니다. 옵서버 패턴은 객체들 간의 결합도를 낮추고 유연한 상호작용을 가능하게 만들어주는 강력한 패턴입니다. 이를 통해 이벤트 기반 시스템 등 다양한 상황에서 유용하게 사용할 수 있습니다.