
자바 개발 패턴 – 옵저버 패턴 – 1 – Java의 내장 옵저버 패턴 (Observable, Observer 인터페이스)
소개
자바에서는 옵저버 패턴을 구현하기 위해 Observable
클래스와 Observer
인터페이스를 제공합니다. 이들을 사용하여 객체 간에 데이터 변경을 감지하고 이벤트를 처리할 수 있습니다. 이 글에서는 자바의 내장 옵저버 패턴에 대해 알아보고, 어떻게 사용하는지 예시를 통해 설명하겠습니다.
옵저버 패턴이란?
옵저버 패턴은 객체 사이의 일대다 의존성을 정의하는 디자인 패턴입니다. 이 패턴은 객체의 상태 변경이 발생했을 때, 이를 관찰하는 다른 객체들에게 알림을 보내고 자동으로 업데이트되도록 합니다. 이는 분산 시스템에서 이벤트 처리, MVC 아키텍처에서 모델과 뷰의 분리, GUI 프로그래밍에서 이벤트 핸들링 등 다양한 상황에서 유용하게 사용됩니다.
Java의 내장 옵저버 패턴
자바에서는 옵저버 패턴을 구현하기 위해 Observable
클래스와 Observer
인터페이스를 제공합니다. Observable
클래스는 관찰 대상 객체를 나타내며, Observer
인터페이스는 이를 구독하는 옵저버 객체의 역할을 정의합니다.
1. Observable 클래스
Observable
클래스는 자바에서 내장으로 제공되며, 관찰 대상 객체를 나타냅니다. 이 클래스는 주제(subject)로써 옵저버들에게 상태 변경을 알리고 업데이트할 수 있도록 돕습니다.
예시를 통해 이해해봅시다. 가상의 주식 시장을 관찰하는 StockMarket
클래스가 있다고 가정해봅시다. 이 클래스는 주식 가격의 변동을 알릴 수 있어야 합니다. 따라서 Observable
클래스를 상속받아 구현할 수 있습니다.
import java.util.Observable;
public class StockMarket extends Observable {
private double price;
public void setPrice(double price) {
this.price = price;
setChanged(); // 변경 사항을 알림
notifyObservers(price); // 옵저버들에게 업데이트를 알림
}
// ...
}
위 예시에서 StockMarket
클래스는 Observable
클래스를 상속받아 구현됩니다. setPrice
메서드는 주식 가격을 설정하고, setChanged
메서드를 호출하여 변경 사항이 발생했음을 알리고, notifyObservers
메서드를 호출하여 옵저버들에게 업데이트를 알립니다.
2. Observer 인터페이스
Observer
인터페이스는 옵저버 역할을 정의하는 인터페이스입니다. 이 인터페이스를 구현하는 클래스는 Observable
객체의 상태 변경을 감지하고 이에 대한 처리를 수행합니다.
예시를 통해 이해해봅시다. 위에서 정의한 StockMarket
클래스를 구독하는 옵저버인 Investor
클래스를 만들어보겠습니다.
import java.util.Observable;
import java.util.Observer;
public class Investor implements Observer {
private String name;
public Investor(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
double price = (double) arg;
System.out.println(name + "님, 주식 가격이 업데이트되었습니다. 현재 가격: " + price);
// 주식 가격에 따른 투자 전략 등을 수행할 수 있음
}
// ...
}
위 예시에서 Investor
클래스는 Observer
인터페이스를 구현합니다. update
메서드는 Observable
객체의 상태가 변경될 때 호출되며, 이를 통해 주식 가격을 업데이트하고 투자 전략 등을 수행할 수 있습니다.
3. 활용 예시
이제 StockMarket
과 Investor
클래스를 활용하여 예시를 만들어보겠습니다. StockMarket
객체를 생성하고 Investor
객체를 옵저버로 등록한 뒤, 주식 가격이 변경될 때마다 옵저버들에게 알립니다.
public class Main {
public static void main(String[] args) {
StockMarket stockMarket = new StockMarket();
Investor investor1 = new Investor("John");
Investor investor2 = new Investor("Emily");
stockMarket.addObserver(investor1);
stockMarket.addObserver(investor2);
stockMarket.setPrice(100.0); // 주식 가격 변경
// ...
}
}
위 예시에서는 StockMarket
객체에 Investor
객체를 옵저버로 등록한 후, setPrice
메서드를 통해 주식 가격을 변경합니다. 이때 등록된 옵저버들에게 업데이트가 전달되어 출력됩니다.
주의해야 할 점
- 내장 옵저버 패턴은 자바 9부터는 Deprecated 되었습니다. 따라서 최신 버전의 자바에서는
Observable
클래스와Observer
인터페이스를 사용하지 않고, 직접 옵저버 패턴을 구현해야 합니다. - 내장 옵저버 패턴은 단방향 통지 방식으로 동작하며, 옵저버들에게 상태 변경에 대한 세부 정보를 전달할 수 없습니다. 따라서 옵저버들이 전체 상태를 알아야 할 경우에는 다른 방식을 고려해야 합니다.
Observable
클래스와Observer
인터페이스는 Java SE에서 제공되는 것이므로, Android 개발에서는 다른 방식을 사용해야 합니다.
이상으로 Java의 내장 옵저버 패턴에 대해 알아보았습니다. 옵저버 패턴은 객체 간의 느슨한 결합을 통해 유연하고 확장 가능한 코드를 작성할 수 있게 해줍니다. 자바에서는 내장된 Observable
클래스와 Observer
인터페이스를 제공하여 간편하게 옵저버 패턴을 사용할 수 있습니다. 조금 더 복잡한 예제와 실제 활용 사례를 통해 옵저버 패턴을 심도있게 공부해보시기를 권장합니다.
주의해야 할 점
- 내장 옵저버 패턴은 자바 9부터는 Deprecated 되었습니다. 따라서 최신 버전의 자바에서는
Observable
클래스와Observer
인터페이스를 사용하지 않고, 직접 옵저버 패턴을 구현해야 합니다.- 내장 옵저버 패턴은 단방향 통지 방식으로 동작하며, 옵저버들에게 상태 변경에 대한 세부 정보를 전달할 수 없습니다. 따라서 옵저버들이 전체 상태를 알아야 할 경우에는 다른 방식을 고려해야 합니다.
Observable
클래스와Observer
인터페이스는 Java SE에서 제공되는 것이므로, Android 개발에서는 다른 방식을 사용해야 합니다.