Home 옵저버
Post
Cancel

옵저버

Observer (옵저버)

정의

  • 이벤트가 일어나는 것을 감시하는 감시자의 역할을 만드는 것
    • 이벤트: 키의 입력, 터치의 발생, 데이터의 수신 등 함수로 직접 요청하지는 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들
  • 옵저버 패턴: 이벤트가 발생할 때마다 ‘즉각적으로 처리’할 수 있도록 만드는 프로그래밍 패턴

사용법

  • 2개의 클래스가 필요
    1. 이벤트를 수신하는 클래스
    2. 이벤트를 발생시키고 전달하는 클래스
  • 두 개의 클래스는 ‘observer’라는 인터페이스를 이용하여 통신한다. (코틀린에서는 listener)
    • 이벤트를 넘겨주는 행위를 ‘callback’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
interface EventListener{ //observer
    fun onEvent(count: Int)
}


class Counter(var listener: EventListener){
    fun count(){
        for(i in 1..100){
            if(i%5==0) listener.onEvent(i)
        }
    }
}

//EventPrinter는 EventListener를 상속
class EventPrinter: EventListener{
    override fun onEvent(count:Int){
        print("${count} ")
    }
    fun start(){
        val counter = Counter(this) //자기 자신 객체를 넘겨준다.
        counter.count()
    }
}
fun main() {
   EventPrinter().start()
}

익명 객체

  • 위 코드와 다르게, EventPrinter가 EventListener를 상속받지 않고 임시로 만든 별도의 EventListener 객체를 대신 넘겨줄 수 있다. 이를 ‘익명 객체’라고 한다.
  • 이렇게 하면, 인터페이스를 구현한 객체를 코드 중간에서도 ‘즉시 생성’하여 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
class EventPrinter2{
    fun start(){
    val counter = Counter(object: EventListener{ //object가 EventListener 상속
         override fun onEvent(count:Int){
        print("${count}-")
    }
    })
    counter.count()
    }
}