Computer Science/디자인 패턴

옵저버 패턴(Observer Pattern)

닉네임못짓는사람 2022. 1. 25. 17:29
반응형

옵저버 패턴


Observe, 영어로 관찰하다 라는 뜻을 가지고 있다.

위 사진은 스타크래프트 게임에 나오는 Observer라는 관측 유닛이다.

플레이어는 위 유닛으로 상대방을 감시하여 정보를 얻어낼 수 있을 것이다.

 

Observer를 보여주는 이유는 옵저버 패턴도 마찬가지이기 때문이다.

옵저버 패턴은 어떤 객체의 상태 변화를 '관측'하여 연관된 객체들에게 알림을 보내는 디자인 패턴이라고 할 수 있다.

예시


예를 들어서 설명해보도록 하자.

한 유튜버가 있고, 해당 유튜버를 구독한 사람들에게

동영상이 업로드될 때마다 구독자들에게 영상 제목을 알려주도록 해보자.

interface Youtuber{
    fun subscribe(subscriber: Subscriber)
    fun unsubscribe(subscriber: Subscriber)
    fun uploadVideo(title: String)
}

interface Subscriber{
    fun update(msg: String)
}

가장 먼저 유튜버와 구독자 인터페이스를 각 선언해준다.

유튜버 인터페이스에선 구독자 추가, 제거, 영상 업로드 기능이 있고

구독자 인터페이스에선 유튜버가 올린 새 영상의 제목을 출력하는 update기능이 있다.

class Gogildong: Youtuber{
    private val subscribers = mutableListOf<Subscriber>()
    
    override fun subscribe(subscriber: Subscriber){
        subscribers.add(subscriber)
    }
    override fun unsubscribe(subscriber: Subscriber){
        subscribers.remove(subscriber)
    }
    override fun uploadVideo(title: String){
        subscribers.forEach{it.update(title)}
    }
}

다음으로 Youtuber인터페이스를 상속받는 Gogildong클래스를 하나 생성해보도록 하자.

이 클래스에선 구독자들을 list형태로 저장할 수 있으며, 영상 업로드 시 각 구독자들의 update함수를 실행한다.

class Dooly: Subscriber{
    override fun update(msg: String){
        println("둘리 수신 ${msg}")
    }
}

class Doner: Subscriber{
    override fun update(msg: String){
        println("도우너 수신 ${msg}")
    }
}

Subscriber인터페이스를 상속받는 Dooly와 Doner클래스에선

update함수를 oberride 하여 영상 제목을 출력하도록 한다.

 

이렇게 각 클래스들을 정의했다면, main함수로 가서 구독, 구독취소, 영상 업로드 등을 실행시켜보자.

fun main(){
    val gildong = Gogildong()
    val dooly = Dooly()
    val doner = Doner()
    
    gildong.subscribe(dooly)
    gildong.subscribe(doner)
    
    gildong.uploadVideo("종로로 갈까요")
    
    gildong.unsubscribe(doner)
    
    gildong.uploadVideo("명동으로 갈까요")
}

위와 같이 해당 객체의 상태가 변화하는 것을 연관된 객체들에게 알리는 것이 옵저버 패턴이다.

장단점


장점

  • 느슨한 결합을 통해 유연한 시스템 개발이 가능하며, 객체 간의 의존성을 제거할 수 있다.
  • push방법을 사용함으로써 직관적으로 이해하기가 쉽다.
  • 실시간으로 효과적인 데이터 배분이 가능하다.

단점

  • observer제거를 적절히 해주지 않으면 메모리 누수가 발생할 수 있다.
  • 너무 많이 사용하면 상태 관리가 힘들 수 있다.
반응형