728x90
반응형
옵저버(Observer) 패턴
옵저버 패턴은 객체 사이의 일대다(one-to-many) 의존성 관계를 정의하는 디자인 패턴 중 하나로, 한 객체의 상태 변화가 다수의 객체에게 알려져 이들 객체가 자동으로 업데이트되도록 하는 패턴입니다. 이 패턴은 주로 느슨한 결합(loose coupling)을 통해 객체 간의 상호 작용을 유지하고 확장 가능한 시스템을 구축할 때 사용됩니다.
장점
- 느슨한 결합(Loose Coupling): 주체 객체와 옵저버 객체들 간의 상호 의존성을 최소화하며, 코드의 재사용성과 유지보수성을 향상시킵니다.
- 확장 가능성: 새로운 옵저버를 추가하거나 기존 옵저버를 제거하기 쉽습니다. 시스템을 확장하거나 수정할 때 유연성을 제공합니다.
- 이벤트 기반 시스템: 이벤트 처리와 관련된 시스템에서 유용하게 사용됩니다. 주로 UI 프레임워크나 게임 엔진에서 이벤트 처리를 구현할 때 적합합니다.
- 분산 시스템: 분산 시스템에서 객체 간의 통신을 처리하는 데 도움을 줍니다.
단점
- 너무 많은 업데이트: 옵저버 패턴을 과도하게 사용하면 업데이트가 과도하게 발생할 수 있어 성능 이슈가 발생할 수 있습니다.
- 디버깅 어려움: 옵저버들 간의 상호작용을 추적하고 디버깅하는 것이 어려울 수 있습니다.
사용 예시
옵저버 패턴은 다음과 같은 상황에서 사용됩니다:
- UI 업데이트: 사용자 인터페이스에서 모델 객체의 상태 변화를 감지하고 화면을 업데이트하는 데 사용됩니다.
- 이벤트 핸들링: 이벤트 기반 프로그래밍에서 이벤트가 발생하면 옵저버들에게 알림을 보내고 처리합니다.
- 주식 시장 알림: 주식 시장에서 주식 가격이 변경될 때 관심있는 투자자들에게 알림을 보내는 데 사용됩니다.
자바 예시 코드
옵저버 패턴을 이해하기 위해 간단한 자바 예시 코드를 살펴보겠습니다.
import java.util.ArrayList;
import java.util.List;
// 주제(Subject) 인터페이스
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 구체적인 주제 클래스
class WeatherStation implements Subject {
private int temperature;
private List<Observer> observers = new ArrayList<>();
public void setTemperature(int temperature) {
this.temperature = temperature;
notifyObservers();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature);
}
}
}
// 옵저버 인터페이스
interface Observer {
void update(int temperature);
}
// 구체적인 옵저버 클래스
class WeatherDisplay implements Observer {
private int temperature;
public void update(int temperature) {
this.temperature = temperature;
display();
}
public void display() {
System.out.println("현재 온도: " + temperature + "도");
}
}
public class Main {
public static void main(String[] args) {
WeatherStation weatherStation = new WeatherStation();
WeatherDisplay display1 = new WeatherDisplay();
WeatherDisplay display2 = new WeatherDisplay();
weatherStation.registerObserver(display1);
weatherStation.registerObserver(display2);
// 온도가 변경될 때마다 옵저버에게 알림
weatherStation.setTemperature(25);
weatherStation.setTemperature(30);
}
}
코드 설명
- Subject 인터페이스는 주제(Subject) 객체의 기본 동작을 정의합니다.
- WeatherStation 클래스는 구체적인 주제 객체로, 온도가 변경될 때 등록된 옵저버에게 알림을 보냅니다.
- Observer 인터페이스는 옵저버(Observer) 객체의 기본 동작을 정의합니다.
- WeatherDisplay 클래스는 구체적인 옵저버 객체로, 온도가 변경될 때 화면에 현재 온도를 표시합니다.
이 예시에서는 날씨 정보를 주제로 사용하고, 화면에 날씨 정보를 출력하는 간단한 시나리오를 구현했습니다.
#디자인패턴 #옵저버패턴 #자바 #코드 #디자인 #프로그래밍
728x90
반응형