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