본문 바로가기
목차훔치기/면접을 위한 CS 전공지식 노트

옵저버 패턴(면접을 위한 CS 전공지식 노트)

by 해삼2 2023. 8. 10.
728x90
반응형
옵저버 패턴

옵저버 패턴

옵저버 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체의 상태 변화를 관찰하고 이에 따른 

동작을 행하는 구조를 정의하는 패턴입니다. 

이 패턴은 주로 객체 간의 의존성을 줄이고, 느슨한 결합(Loose Coupling)을 이루며, 객체 간의 

상호작용을 효과적으로 관리하고 확장하기 위해 사용됩니다.

 

옵저버 패턴 구성요소

Subject (주체) 또는 Observable (관찰 대상): 

상태 변화를 관찰하고자 하는 객체입니다. 이 객체는 옵저버들의 목록을 유지하며, 

상태가 변경될 때마다 등록된 옵저버들에게 알림을 보냅니다.

Observer (관찰자): 

주체(Subject)의 상태 변화를 관찰하고 이에 따른 특정 동작을 수행하는 객체입니다. 

옵저버들은 주체에 등록되어야 하며, 주체가 상태를 변경할 때마다 이를 감지하고 적절한 작업을 수행합니다.

Concrete Subject (구체적인 주체): 

실제로 상태 변화를 발생시키는 객체로, 주로 주체 인터페이스를 구현합니다. 

상태가 변경될 때마다 등록된 옵저버들에게 알림을 보냅니다.

Concrete Observer (구체적인 관찰자): 

옵저버 인터페이스를 구현하여 상태 변화에 대한 특정 동작을 정의하는 객체입니다. 

주체에 등록되어 상태 변화를 감지하고 처리합니다.

 

옵저버 패턴 동작 방식

1. 주체(Subject) 객체는 옵저버들의 목록을 유지하고, 등록된 옵저버들에게 알림을 보낼 수 있는 메커니즘을 갖춥니다.
2. 옵저버들은 주체(Subject)의 상태 변화에 대한 알림을 받기 위해 주체에 등록됩니다.
3. 주체의 상태가 변경되면, 주체는 등록된 모든 옵저버들에게 상태 변화를 알립니다.
4. 옵저버들은 상태 변화 알림을 받으면 해당 상태에 따른 적절한 동작을 수행합니다.

 

옵저버 패턴 장점

느슨한 결합 (Loose Coupling):

주체와 옵저버 간의 상호작용이 최소화되므로, 주체와 옵저버들은 독립적으로 변경 및 확장이 가능합니다.

확장성과 유연성: 

새로운 옵저버를 추가하거나 기존 옵저버를 변경하더라도 주체 코드를 수정하지 않아도 됩니다.

이벤트 기반 아키텍처 구축: 

상태 변화가 발생할 때 필요한 옵저버들에게 자동으로 알림을 보내는 방식으로 이벤트 기반 시스템을 

구축할 수 있습니다.

 

옵저버 패턴 단점

너무 많은 업데이트:

많은 옵저버가 등록되어 있을 경우, 상태 변화 시 모든 옵저버에게 알림을 보내는 작업이 오버헤드를

초래할 수 있습니다.

순서에 따른 의존성: 

옵저버들의 처리 순서에 따라 결과가 달라질 수 있으며, 이로 인해 예측할 수 없는 동작이 발생할 수 있습니다.

메모리 관리: 

주체와 옵저버 사이의 강한 참조 관계가 형성될 수 있어 메모리 누수의 가능성이 있습니다.

요약하면, 옵저버 패턴은 느슨한 결합과 확장성을 제공하여 유연한 시스템을 구축할 수 있게 해주지만, 

너무 많은 업데이트 및 순서 의존성과 같은 단점도 고려해야 합니다.

 

 

옵저버 패턴 자세히알기!

주체 (Subject): 학교 (School)
학교는 변화하는 상황을 주도적으로 관리하고 있는 주체입니다. 

학교 내부에서 다양한 사건이 발생할 때마다 이를 주변의 선도부에게 알려주어야 합니다.

옵저버 (Observer): 선도부 (Student Leaders)
선도부는 학교 내부에서 변화하는 상황을 관찰하고, 이에 따라 학생들에게 정보를 전달하고 조치를 취하는 

역할을 합니다. 

선도부들은 학교의 다양한 활동과 이벤트에 관심을 가지며, 상황 변화 시 학생들에게 필요한 정보와 

시를 제공합니다.

구체적인 주체 (Concrete Subject): 특정 학과 (Department of Arts)
구체적인 주체는 실제로 상태 변화를 발생시키는 객체입니다. 예를 들어, '예술 학과'는 특정 이벤트를 

기획하거나 예술 작품을 전시하는 등의 활동을 통해 학교의 상태를 변화시킵니다.

구체적인 옵저버 (Concrete Observer): 특정 선도부원 (Student Leader: Emily)
구체적인 옵저버는 옵저버 인터페이스를 구현하여 상태 변화에 대한 특정 동작을 정의하는 객체입니다. 

선도부원 중 한 명인 Emily는 예술 학과에서 발생하는 사건에 관심을 가지고, 

해당 사건이 발생하면 학생들에게 필요한 정보를 전달하고 지원합니다.

알림 (Notification): 학교 공지 (School Announcement)
상태 변화를 알리는 방법으로 학교 공지를 사용합니다. 

예를 들어, 예술 학과에서 이벤트를 계획하면 학교 공지를 통해 선도부원들에게 알림을 전달하고 이를 

학생들에게 홍보합니다.

 

 

*바쁜 사람을 위한 깜찍한 정리

옵저버 패턴은 객체의 상태 변화를 감지하고, 이에 따른 동작을 수행하는 구조를 정의하는 소프트웨어 디자인 패턴입니다. 객체의 상태가 변화하면 주체(Subject) 객체는 등록된 옵저버(Observer)들에게 상태 변화를 알리며, 각 옵저버들은 이를 처리하는 메소드를 호출하여 필요한 작업을 수행합니다. 예를 들어 주체가 슈퍼마켓이고 새로운 상품이 들어오면 그 상품의 가격이라든지 진열대 위치 등의 정보를 각 슈퍼마켓 직원들에게 알려주어서 슈퍼마켓의 상태를 공유하는 역할을 의미합니다. 하지만 너무 많은 상품이 들어오거나 그런 경우는 어떤것을 먼저 처리 해야 하는지 예측 할 수 없는 동작이 발생할수 있고 오버헤드를 초래 할 수 있는 단점이 있습니다.

 

 

 

 

 

728x90
반응형