티스토리 뷰
Observer 패턴 선택 이유 :
지피티에게 헌터앤애니멀 코드를 보여주고, 이 코드에 필요한 패턴이 무엇이냐고 물어보니, 옵저버 패턴을 추천했다.
지피티의 아이디어는 이러하다.
-한 캐릭터의 상태 변화(죽음)가 다른 객체들에게 자동으로 전달되도록 한다.
이를 보고 알아두면 나중에 코드 고치기에 용이할 것 같아 조사해보려고 한다.
Observer 패턴이란 :
한 객체의 상태 변화가 여러 객체에게 자동으로 통지되는 구조이다.

Observer 패턴 예시1 :
1. 유튜버-구독자 예시
유튜버가 새 영상을 업로드했다고 하자.
- 유튜버: Subject
- 구독자들: Observers
가 돼서 구독자들에게 유튜버의 상태 변화(영상 올림) 알림이 자동으로 가게 된다.
Observer 패턴 예시2 :
2. 가수-팬 예시
가수가 새 앨범을 발매했다고 해보자.
- Taylor : 발행자 subject
- 팬들 : 구독자 observer
Taylor가 새 앨범 나왔어! 하고 한 번만 올리면, 전 세계 팬들에게 알림이 간다.
Taylor는 팬들이 누군지, 몇 명인지 몰라도 공지를 올리면 끝.
팬들은 알아서 구독, 알아서 반응한다.
<지피티가 짜 준 코드 : 가수 - 팬 "새 앨범 나왔다고 알리기" >
작동 흐름
1. 팬들이 Taylor 팔로우 : attach()
2. Taylor가 "새 앨범 나왔어!" 게시 : notifyAll()
3. 등록된 모든 팬들에게 동시에 알림이 간다 : update()
//observer interface (팬들)
interface Observer {
void update(String message);
}
//subject interface (테일러 스위프트)
interface Subject {
void attach(Observer o);//팬들이 테일러 구독
void detach(Observer o);//팬들이 구독 취소
void notifyAll(String message);
}
class TaylorSwift implements Subject {
private final List<Observer> fans = new Arraylist<>();
public void attach(Observer o) {fans.add(o);}//팬 목록에 옵저버 o를 등록한다.(팬들 리스트에 새로운 팬 추가)
public void detach(Observer o) {fans.remove(o);}//팬 목록에 옵저버 o를 제거한다.
//등록된 팬들 호출해서 한꺼번에 알리기
public void notifyAll(String message) {
for (Observer o : fans)
o.update(message);
}
public void releaseAlbum(String album) {
notifyAll("New album out now: " + album + " 💿");
}
}
// 구체적인 옵서버 (팬)
class Fan implements Observer {
private final String name;
public Fan(String name) { this.name = name; }
//팬이 소식을 받게 된다.
public void update(String msg) {
System.out.println(name + " received: " + msg);
}
}
// 실행 예시
public class Main {
public static void main(String[] args) {
TaylorSwift taylor = new TaylorSwift();
Fan fan1 = new Fan("Namgyu");
taylor.attach(fan1);//fan1이 taylor 구독
//taylor가 releaseAlbum 메소드를 호출하면 -> notifyAll 호출 -> notifyAll 메소드 안에서 옵저버.update 호출
//최종적으로 옵저버에게 알림 간다.
taylor.releaseAlbum("Midnights");
}
}
꽤 재밌는 주제로 코드를 짜줘서 그런지 이해하기가 쉬웠다.
그리고 좀 더 물어보니 지금 배우고 있는 소프트웨어 공학과 컴퓨터 네트워크 관련한 실무 예시도 알려줬다.
1. 소프트웨어 공학에서의 옵저버 패턴
- MVC 아키텍처 패턴의 일부
MVC(Model-View-Controller)에서 모델의 데이터 상태가 바뀌면 controller가 트리거 역할을 하고, 이것이 view에게 전달되어 자동으로 화면을 갱신한다고 한다.
즉, View가 Model을 관찰(observe)하다가, Model의 데이터가 바뀌면 View가 업데이트되는 것이다.
(질문: 소프트웨어 공학에서는 View와 Model이 소통하지 않고 Controller를 통해서만 연결된다고 배웠던 것 같은데 직접적으로 연결되는건지..? 궁금하다)
2. SNMP?
UDP 이용하는 프로토콜로 컴퓨터 네트워크 수업에서 언급하셨던 것 같은데...
라우터나 스위치 상태를 감시하는 모니터링 시스템에서도 옵저버 구조가 쓰인다고 한다.
장비의 상태 변화를 SNMP 메시지로 알리고, 관찰자 역할인 관리 서버가 그걸 받아 관리자에게 보낸다고 한다.
3. 웹소켓?
HTTP는 요청-응답 구조이지만
Websocket은 서버가 클라이언트에게 즉시 알림(push)을 보낼 수 있다고 한다.
서버-Subject, 클라이언트-Observer
- 이건 자프실 수업 가이드 시트를 보니 Socket에 대해 배우는 것 같아 가져왔다. 네트워크 프로그래밍할 때 옵저버 패턴 구조가 있는지 봐야겠다.
현재 배우고 있는 다른 수업들에서도 옵저버 패턴의 흔적을 찾아볼 수 있어 흥미로웠다. 다만 지피티를 통해 찾은거라 정확하지는 않은 것 같아서 시험기간 끝나면 좀 더 자세히 알아보고 싶다...!
'학교 강의 > Java프로그래밍및실습2' 카테고리의 다른 글
| [Network Programming] 내용 정리 (0) | 2025.11.04 |
|---|---|
| [GUI+EVENT+THREAD] 알낳기 게임 (1) | 2025.11.02 |
| [디자인 패턴] 전략(Strategy) 패턴 실습하기 (0) | 2025.10.15 |
| [SOLID원칙] 코드 리팩토링 (1) | 2025.10.11 |
| [SOLID원칙] 문제 만들기 (0) | 2025.10.04 |
