반응형

옵저버 패턴(Observer Pattern)

안녕하세요 취업길잡이 Coy입니다

오늘은 옵저버 패턴(Observer Pattern)에 대해서 알아보도록 하겠습니다

 

옵저버 패턴이란

옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 해당 관찰자들에게 알림을 보내는 디자인 패턴입니다. 이는 주로 분산 이벤트 핸들링 시스템을 구현하거나 발행/구독 모델로 알려져 있습니다.

간단한 예시로는 메시지 전달 앱을 들 수 있습니다.

여러 사용자가 채팅방을 구독하는데, 한 사용자가 메시지를 보내면 해당 채팅방에 있는 다른 사용자들은 그 메시지를 받아 볼 수 있습니다. 이는 옵서버 패턴의 개념과 유사한 방식으로 작동합니다.

상태 변화가 발생하면(메시지 전송), 해당 객체(채팅방)는 그 상태 변화를 관찰하는 다른 객체(사용자)들에게 알림을 보내어 메시지를 전달하게 됩니다.

이렇게 옵서버 패턴을 사용하면 객체 간의 상호작용을 유연하게 구현할 수 있고, 객체의 상태 변화를 감지하고 적절히 대응하는 데에 매우 유용합니다.

 

사용하는 목적

1. 이벤트 중심의 시스템에서 객체 간의 상호작용이 필요한 경우, 옵저버 패턴은 이를 구현하는데 효과적입니다. 예를 들어, GUI 프로그래밍이나 이벤트 핸들링 시스템에서 사용될 수 있습니다.

 

2. 여러 컴포넌트나 모듈이 분산되어 있을 때, 상태 변화가 발생하면 해당 변화를 관심 있는 모든 옵저버들에게 효율적으로 전달할 수 있습니다.

 

3. 주체 객체와 옵저버 객체들 간의 느슨한 결합을 통해, 주체 객체의 상태 변화에 대한 처리를 각각의 옵저버 객체에 위임함으로써 객체 간 의존성을 줄입니다.

 

 

구조

 

 

예제 코드

import java.util.ArrayList;
import java.util.List;

// 옵저버 인터페이스
interface Observer {
    void update(String message);
}

// 메신저 클래스
class Messenger {
    private List<Observer> observers = new ArrayList<>();

    void subscribe(Observer observer) {
        observers.add(observer);
    }

    void unsubscribe(Observer observer) {
        observers.remove(observer);
    }

    void sendMessage(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

// 구독자 - 로그인 알림
class LoginNotifier implements Observer {
    private String user;

    LoginNotifier(String user) {
        this.user = user;
    }

    public void update(String message) {
        System.out.println("[" + user + "] Logged in: " + message);
    }
}

// 구독자 - 그룹 메시지 수신
class GroupMessageReceiver implements Observer {
    private String group;

    GroupMessageReceiver(String group) {
        this.group = group;
    }

    public void update(String message) {
        System.out.println("[" + group + "] New message: " + message);
    }
}

// 메인 애플리케이션
class Main {
    public static void main(String[] args) {
        Messenger messenger = new Messenger();

        LoginNotifier user1Notifier = new LoginNotifier("User1");
        messenger.subscribe(user1Notifier);

        GroupMessageReceiver groupReceiver = new GroupMessageReceiver("Developers");
        messenger.subscribe(groupReceiver);

        // 메시지 전송 시 구독자들에게 알림
        messenger.sendMessage("Hello, everyone!");

        // 사용자 로그인 시도 시 구독자들에게 알림
        messenger.sendMessage("User1 logged in.");
    }
}

 

 

간단한 예시로  메세징 예제코드를 만들어 보았습니다. 

 

여기서 Messenger 클래스는 주체(Subject) 역할을 합니다.

- 이 클래스는 메시지를 발송하고, 옵저버를 등록하고 제거하는 메서드를 제공합니다.

 

Observer 인터페이스는 옵저버가 구현해야 하는 update() 메서드를 정의합니다.

- 옵저버 클래스들은 Observer 인터페이스를 구현합니다.

- LoginNotifier와 GroupMessageReceiver 클래스는 각각 특정한 종류의 옵저버 역할을 합니다.

- LoginNotifier는 특정 사용자가 로그인할 때 알림을 받고, GroupMessageReceiver는 특정 그룹으로 온 새로운 메시지를 받습니다.

 

Main 클래스은 단순히 이 예제 코드들을 실행해보는 용도로 작성되었습니다

 

옵저버 패턴의 장단점

장점

1. 주체와 옵저버 간의 관계가 느슨하게 구성되어 있어, 주체 객체가 변경되어도 옵저버에 영향을 미치지 않고 관리할 수 있습니다.
2. 새로운 옵저버를 추가하거나 기존 옵저버를 제거할 수 있어 시스템의 유연성이 향상됩니다. 즉, 쉽게 확장 가능합니다.
3. 다수의 객체 간 상태 변화를 효율적으로 관리하고 처리할 수 있어, 분산 이벤트 핸들링 시스템에 적합합니다.

 

단점 

1. 주체 객체에서 옵저버 객체를 명시적으로 제거하지 않을 경우, 옵저버들이 불필요하게 메모리를 소비할 수 있습니다.
2. 옵저버들 간에 실행 순서를 보장하기 어렵기 때문에, 순서가 중요한 경우 문제가 발생할 수 있습니다.
3. 주체 객체의 상태 변화가 자주 발생할 경우, 관련된 모든 옵저버에게 업데이트를 보내야 하므로 성능 저하가 발생할 수 있습니다.

 

 

 

오늘 이렇게 옵저버 패턴에 대해서 알아보았습니다.

디자인 패턴 자체가 가독성을 좋게 하거나, 유지보수가 용이하게 해주는 것은 맞지만, 상황에 따라 잘 사용하는 것이 중요합니다

출처(https://m.yes24.com/Goods/Detail/17525598)


컬럼으로 다루어 주면 좋겠다 싶은 주제가 있으면 댓글로 알려주세요

 

도움이 필요하시면 사연을 메일로 보내주세요

 

jek300300@gmail.com

 

도움이 되셨다면 공감과 구독 부탁드립니다

 

읽어주셔서 감사합니다

 

당신의 취업이 성공할 때까지 같이 하겠습니다! by 취업길잡이 Coy

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기