PHpullh

PYTHON · 객체지향

옵저버 패턴

옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.

객체지향고급observer옵저버event이벤트

핵심 설명

옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.

Python code

from typing import Callable, Any

class EventEmitter:
    def __init__(self):
        self._listeners: dict[str, list[Callable]] = {}

    def on(self, event: str, callback: Callable):
        self._listeners.setdefault(event, []).append(callback)

    def off(self, event: str, callback: Callable):
        if event in self._listeners:
            self._listeners[event].remove(callback)

    def emit(self, event: str, *args: Any, **kwargs: Any):
        for cb in self._listeners.get(event, []):
            cb(*args, **kwargs)

# 사용 예: 주문 시스템
class OrderSystem(EventEmitter):
    def place_order(self, item: str, qty: int):
        print(f"주문 접수: {item} x {qty}")
        self.emit("order_placed", item=item, qty=qty)

# 옵저버(리스너) 등록
shop = OrderSystem()
shop.on("order_placed",
    lambda **kw: print(f"  [재고] {kw['item']} {kw['qty']}개 차감"))
shop.on("order_placed",
    lambda **kw: print(f"  [알림] {kw['item']} 주문 알림 발송"))
shop.on("order_placed",
    lambda **kw: print(f"  [로그] 주문 기록 저장"))

shop.place_order("노트북", 2)

학습 팁

약한 참조(weakref)를 사용하면 옵저버가 가비지 컬렉션되었을 때 자동으로 해제됩니다.

주의할 점

옵저버 콜백에서 예외가 발생하면 나머지 옵저버가 호출되지 않습니다. try/except로 각 콜백을 보호하세요.

자주 묻는 질문

옵저버 패턴란 무엇인가요?

옵저버 패턴으로 객체 상태 변경 시 관련 객체들에게 자동으로 알림을 보냅니다.

옵저버 패턴 학습 시 주의할 점은 무엇인가요?

옵저버 콜백에서 예외가 발생하면 나머지 옵저버가 호출되지 않습니다. try/except 로 각 콜백을 보호하세요.

Continue Learning

Python 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.