JAVA/JAVA Design Pattern

JAVA 옵저버(Observer) 패턴

임베디드 친구 2025. 1. 1. 14:28
반응형

옵저버(Observer) 패턴은 객체 간의 의존 관계를 관리하는 디자인 패턴입니다. 이 패턴을 사용하면 한 객체의 상태가 변경될 때 그 객체를 관찰(Observe) 하고 있던 다른 객체들에게 변경 사항이 자동으로 통지됩니다.

이 글에서는 옵저버 패턴의 개념, 실제 사용 사례, Java에서 제공하는 Observer 인터페이스와 Observable 클래스를 예제와 함께 살펴보겠습니다.

1. 옵저버 패턴이란?

옵저버 패턴은 주체(Subject)옵저버(Observer)로 나뉩니다.

  • 주체(Subject): 상태가 변경될 때 옵저버에게 알리는 객체
  • 옵저버(Observer): 주체의 상태 변화를 감지하고 특정 행동을 수행하는 객체

옵저버 패턴의 구조

  • 주체(Subject): 상태 변화가 발생하면 등록된 옵저버에게 변경 사항을 통지합니다.
  • 옵저버(Observer): 주체에 등록되어 상태 변화를 통보받습니다.

주의: 옵저버 패턴일대다(One-to-Many) 관계를 기반으로 동작합니다.

2. 클래스 다이어그램 (Plaintext)

+--------------------+    +-------------------+
|   Observable            |     Observer      |
+--------------------+    +-------------------+
| - observers        |    | + update()        |
| + addObserver()    |    +-------------------+
| + removeObserver() |
| + notifyObservers()|
+--------------------+               ^
           |                         |
           |                         |
+------------------+       +-------------------+
| ConcreteSubject  |       |  ConcreteObserver |
+------------------+       +-------------------+
| - state          |       | - observerState   |
| + setState()     |       | + update()        |
| + getState()     |       +-------------------+
+------------------+                 

설명

  1. Observable: 주체의 기본 인터페이스/클래스
  2. Observer: 옵저버의 기본 인터페이스
  3. ConcreteSubject: 상태 변화를 관리하는 구체적인 주체
  4. ConcreteObserver: 옵저버 역할을 수행하는 객체

3. 옵저버 패턴 사용 사례: 이벤트 시스템

옵저버 패턴은 다음과 같은 상황에 자주 사용됩니다:

  • 이벤트 리스너: GUI의 버튼 클릭 이벤트
  • 뉴스 피드: 뉴스 업데이트를 구독하는 시스템
  • 데이터 변경 감지: 상태 변경 시 실시간 알림

4. Java에서의 ObserverObservable

Java는 기본적으로 옵저버 패턴을 지원하는 Observer 인터페이스와 Observable 클래스를 제공합니다.

주요 메서드

  • Observable 클래스:
    • addObserver(Observer o): 옵저버 등록
    • deleteObserver(Observer o): 옵저버 삭제
    • notifyObservers(): 모든 옵저버에게 통지
    • setChanged(): 상태 변경을 알림
  • Observer 인터페이스:
    • update(Observable o, Object arg): 상태 변경 시 실행되는 메서드

5. 예제 코드

옵저버 패턴 구현 예제

아래는 옵저버 패턴의 간단한 구현 예제입니다. 뉴스 피드 시스템을 가정합니다.

import java.util.*;

// 1. 주제(Observable)
class NewsFeed extends Observable {
    private String news;

    public void setNews(String news) {
        this.news = news;
        setChanged(); // 상태가 변경되었음을 알림
        notifyObservers(news); // 모든 옵저버에게 통지
    }
}

// 2. 옵저버(Observer)
class Subscriber implements Observer {
    private String name;

    public Subscriber(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(name + " received news update: " + arg);
    }
}

// 3. 메인 실행 코드
public class ObserverPatternExample {
    public static void main(String[] args) {
        // 주제 생성
        NewsFeed newsFeed = new NewsFeed();

        // 옵저버 생성 및 등록
        Subscriber subscriber1 = new Subscriber("Alice");
        Subscriber subscriber2 = new Subscriber("Bob");

        newsFeed.addObserver(subscriber1);
        newsFeed.addObserver(subscriber2);

        // 뉴스 업데이트
        newsFeed.setNews("Breaking News: Observer Pattern Implemented!");
        newsFeed.setNews("New Update: Java Observer Example Completed!");
    }
}

실행 결과

Alice received news update: Breaking News: Observer Pattern Implemented!
Bob received news update: Breaking News: Observer Pattern Implemented!
Alice received news update: New Update: Java Observer Example Completed!
Bob received news update: New Update: Java Observer Example Completed!

6. 결론

옵저버 패턴은 객체 간의 느슨한 결합(Loose Coupling)을 제공하며, 상태 변경에 유연하게 대응할 수 있는 구조를 제공합니다.

  • 장점: 주체와 옵저버가 독립적으로 존재할 수 있습니다.
  • 단점: 옵저버가 많아지면 성능에 영향을 줄 수 있습니다.

핵심 요약

  • 주체(Subject)는 상태 변경 시 옵저버에게 알림을 보냄.
  • Java는 ObserverObservable을 제공하여 쉽게 구현 가능.

이제 옵저버 패턴을 사용하여 유연하고 확장 가능한 시스템을 설계해보세요!

반응형