반응형
옵저버(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() | +-------------------+
+------------------+
설명
- Observable: 주체의 기본 인터페이스/클래스
- Observer: 옵저버의 기본 인터페이스
- ConcreteSubject: 상태 변화를 관리하는 구체적인 주체
- ConcreteObserver: 옵저버 역할을 수행하는 객체
3. 옵저버 패턴 사용 사례: 이벤트 시스템
옵저버 패턴은 다음과 같은 상황에 자주 사용됩니다:
- 이벤트 리스너: GUI의 버튼 클릭 이벤트
- 뉴스 피드: 뉴스 업데이트를 구독하는 시스템
- 데이터 변경 감지: 상태 변경 시 실시간 알림
4. Java에서의 Observer
와 Observable
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는
Observer
와Observable
을 제공하여 쉽게 구현 가능.
이제 옵저버 패턴을 사용하여 유연하고 확장 가능한 시스템을 설계해보세요!
반응형
'JAVA > JAVA Design Pattern' 카테고리의 다른 글
JAVA 템플릿 메서드 (Template Method) 패턴 (0) | 2025.01.03 |
---|---|
JAVA 커맨드 패턴(Command Pattern) (0) | 2025.01.02 |
JAVA 전략(Strategy) 패턴 (0) | 2024.12.30 |
JAVA 플라이웨이트(Flyweight) 패턴: 메모리 절약을 위한 공유 객체 사용 (0) | 2024.12.29 |
JAVA 브리지(Bridge) 패턴 (0) | 2024.12.28 |