옵저버 패턴... 공부해보자

kim hyun woo·2022년 7월 16일
1

옵저버패턴(Observer Pattern)이란?


우선 옵저버란 단어는 스타크래프트를 해봤다면 ,, 한번 이상 들어봤을 것이다. 스타크래프트에서의 옵저버는 안보이는 무언가를 보여준다거나 시야를 밝혀주는 유닛이다. 한마디로 관찰자, 관측자 라고 할 수 있다.

즉 여기서의 옵저버 패턴이란 어떤 이벤트를 감시하는 패턴이다?..
뭔 말이지;;

그럼 무엇을 감시하는가?...

  1. 외부 인터럽트가 발생했을때 (ex 키보드, 시리야, 터치)등이 발생하면 그것을 감시하고 있다가 동작시키는 것이다.
  2. API를 호출 했을 때 응답데이터가 수신됐을 때 등이 있다.

위에서 말한 이벤트가 발생하면 무언가 동작시켜야 된다. 시리야를 부르면 시리가 나타난다든가, API호출이 돼서 데이터를 수신 받으면 UI에 띄어 준다든가.. 등등


이해를 하기 위해 간단한 예시를 들어보자..!!

옛날 옛날에..
A클래스와 B클래스가 살았다.
A클래스는 배달이 올 때 마다 초인종이 울리길 원했다.

초인종은 B클래스에 속한 기능이다. 그럼 A클래스는 B클래스의 기능을 사용하기 위해서는 B클래스를 인스턴스화 해야된다.
하지만 여기서 굉장한 모순이 발생한다....무서운 얘기는 아니다.
무슨 모순이냐면 B클래스가 배달이 올 때마다 초인종을 누르기 위해서는 A클래스에 메소드를 호출해야되는데 A클래스는 B클래스를 일방적으로 인스턴스화 했기 때문에 접근을 하지 못한다..
이것을 해결하기 위해 옵저버 패턴을 이용해야 된다.


옵저버패턴을 어떻게 이용하는가??
간단하게 말하면 두 클래스 사이에 인터페이스를 구현하여 전달하는 것이다.

class B : Event { //Event라는 인터페이스를 상속
  override fun onOperate(){ //Event 메소드
      println("벨이 울립니다")
  }
}

B클래스는 인터페이스를 상속하여 메소드를 재정의 한다.
만약 인터페이스이 메소드를 호출되면 벨을 울리는 기능을 추가한다.

class A (var event : Event){
	fun onDeliver(){
      event.onOperate()
    }
}

그 다음 A클래스는 B클래스에서 재정의한 인터페이스를 파라미터로 받고 그것이 배달이 올 때 마다 아까 재정의한 onOperate()를 호출해준다. onOperate()를 호출하면 벨이 울리게 된다. 이게 맞나;


이건 내가 다른 예시로 코드를 짜보았다.
나의 목적은 100이하의 정수를 10번 랜덤으로 나오게 하였다. 만약 정수가 짝수이면 짝수라고 알려주는 출력값을 나오게 하였다.
한마디로 짝수값일 때를 관찰하여 출력해주는 것이다.

interface Event{ //인터페이스
    fun onEvent(data : Int)
}
class Observing(var event : Event){ //A
    fun onObserving(){
        var random = Random()
        for (i in 1..10) {
            var data = random.nextInt(100)
            if (data % 2 == 0) {
                event.onEvent(data)
            }
        }
    }
}

class Observer : Event {
    override fun onEvent(data: Int) { //B
        println("짝수 값 : $data")
    }
    fun onStart(){
        Observing(this).onObserving()
    }
}


fun main(){
    var client = Observer()
    client.onStart()
}

결과값....둑은 둑은..ㅎㅎ

짝수 값 : 50
짝수 값 : 38
짝수 값 : 32
짝수 값 : 26
짝수 값 : 82
짝수 값 : 8

짠 정상적으로 작동을 한다..!! 다행이다

하지만 코틀린의 강점을 더살려서 익명객체로 구현해보자

class Observer {
    fun onStart(){
        var observing = Observing(object : Event{
            override fun onEvent(data: Int) {
                println("짝수 값 : $data")
            }
        })
        observing.onObserving()
    }
}

이것은...코틀린 개쩐다라는 말밖에 안나온다 ㅎㅎ;;

observing이라는 인스턴스를 만들 때 한번에 상속을 받아 재정의까지 해주었다.. 그리고 바로 호출까지 해준다.
증말 간단하면서 무섭다 이젠.. ㅎㅎ
하지만 더 공부할 수록 강해지는 느낌이다.. 무야호!!!!!!


후기

패턴의 종류는 정말 많다. 모든 패턴을 내가 이해 할 수 있을지는 모르겠지만 최대한으로 이해하고 잘 활용하고 싶다..
앞으로도 화이팅 해보자!! 안드로이드
개발자 되기 9998일전..

profile
TIL(Today I Learned)

0개의 댓글