카테고리 없음

[java] 옵저버(Observer) 패턴

조용한닭 2024. 1. 12. 12:43
728x90
반응형

옵저버(Observer) 패턴

옵저버 패턴은 객체 사이의 일대다(one-to-many) 의존성 관계를 정의하는 디자인 패턴 중 하나로, 한 객체의 상태 변화가 다수의 객체에게 알려져 이들 객체가 자동으로 업데이트되도록 하는 패턴입니다. 이 패턴은 주로 느슨한 결합(loose coupling)을 통해 객체 간의 상호 작용을 유지하고 확장 가능한 시스템을 구축할 때 사용됩니다.

장점

  1. 느슨한 결합(Loose Coupling): 주체 객체와 옵저버 객체들 간의 상호 의존성을 최소화하며, 코드의 재사용성과 유지보수성을 향상시킵니다.
  2. 확장 가능성: 새로운 옵저버를 추가하거나 기존 옵저버를 제거하기 쉽습니다. 시스템을 확장하거나 수정할 때 유연성을 제공합니다.
  3. 이벤트 기반 시스템: 이벤트 처리와 관련된 시스템에서 유용하게 사용됩니다. 주로 UI 프레임워크나 게임 엔진에서 이벤트 처리를 구현할 때 적합합니다.
  4. 분산 시스템: 분산 시스템에서 객체 간의 통신을 처리하는 데 도움을 줍니다.

단점

  1. 너무 많은 업데이트: 옵저버 패턴을 과도하게 사용하면 업데이트가 과도하게 발생할 수 있어 성능 이슈가 발생할 수 있습니다.
  2. 디버깅 어려움: 옵저버들 간의 상호작용을 추적하고 디버깅하는 것이 어려울 수 있습니다.

사용 예시

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

  • 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
반응형