우주전쟁을 해본 사람들이라면 다들 친숙한 이 녀석, 바로 옵저버다. 알다시피 옵저버(Observer)는 이름 그대로 관찰자, 감시자의 역할을 한다.
프로그래밍에서는 다양한 이벤트가 일어나는데,
이벤트의 예시는
등이 있으며 이런 이벤트가 발생할 때마다 그것을 감지해 즉각적으로 처리하는 것이 옵저버 패턴의 역할이다.
Observer Pattern의 구현시에는 2개의 class가 필요한데, 이벤트를 수신하는 class A와 이벤트의 발생시키고 전달해주는 class B이다. 이 때 중간에 이벤트의 수신해주는 interface
를 두게 되고 이 녀석을 'observer'라고 부른다. kotlin에서는 'listener'라고 부르며, 이 이벤트를 넘겨주는 행위를 우리가 흔히 말하는 'callback'이라고 한다.
kotlin으로 작성하였습니다. Counter가 이벤트를 발생시키고 전달해주는 class, EventPrinter가 이벤트를 수신하는 class, Counter의 객체로 전달되는 EventListener가 interface가 됩니다.
fun main() {
EventPrinter().start()
}
interface EventListener {
fun onEvent(count: Int)
}
class Counter(var listener: EventListener) {
fun count() {
for(i in 1..100) {
if(i % 5 == 0) listener.onEvent(i)
}
}
}
class EventPrinter: EventListener {
override fun onEvent(count: Int) {
print("${count}-")
}
fun start() {
val counter = Counter(this) // EventListener로 받음
counter.count()
}
}
위와 같은 방식 외에도 EventPrinter
class에서 Counter가 받는 객체를 익명 객체로도 전달해줄 수 있습니다.
fun main() {
EventPrinter().start()
}
interface EventListener {
fun onEvent(count: Int)
}
class Counter(var listener: EventListener) {
fun count() {
for(i in 1..100) {
if(i % 5 == 0) listener.onEvent(i)
}
}
}
class EventPrinter {
fun start() {
var counter = Counter(object: EventListener {
override fun onEvent(count: Int) {
print("${count}-")
}
})
counter.count()
}
}