Kotlin

[Kotlin] Observer Pattern(옵저버 패턴) 사용 방법

cob 2022. 10. 5. 13:28
Observer Pattern

 

이벤트가 발생할 때마다 ‘즉각적으로 처리’할 수 있도록 만드는 프로그래밍 패턴으로
이벤트가 일어나는 것을 감시하는 감시자의 역할을 만든다고 하여 옵저버라고 한다. 

ex) 키의 입력, 터치의 발생, 데이터의 수신 등

 

이벤트란?
함수로 요청하지 않았지만 시스템이나, 루틴에 의해서 발생하게 되는 동작들을 이벤트라고 부른다.

 

 


1. 기본 개념

B에서는 자신의 이벤트를 받을 수 있는 인터페이스를 만들어 공개하고 A는 이를 구현하여 B에 넘겨주면 인터페이스만 알아도 이벤트를 넘겨줄 수 있다.

옵저버 패턴

  • 이때 이 인터페이스를 ‘Observer’ 또는 코틀린에서는 ‘Listener’라고 부르며 이렇게 이벤트를 넘겨주는 행위를 ‘Callback’이라고 합니다.

 

 

 


2. 옵저버 패턴 구현

 


  
fun main() {
EventPrinter().start()
}
/*
EventPrinter와 Counter 연결시킬 인터페이스인 EventListener
*/
interface EventListener {
fun onEvnet(count: Int)
}
/*
- 숫자를 카운트하며 5의 배수 마다 이벤트를 발생시키는 Counter
- 이벤트를 발생시키기 위해 생성자에서 EventListener를 속성으로 받는다.
*/
class Counter(var listener:EventListener) {
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() {
// Counter의 인스턴스를 만들되 this라는 키워드로 EventListener 구현부를 넘겨준다.
val counter = Counter(this)
counter.count()
}
}
  • this는 EvnetPrinter 객체 자신을 나타내지만 받는 쪽(Counter)에서 EventListener만 요구했기 때문에 EventListener구현부만 넘겨주게 된다. 이를 객체지향의 다향성이라고 한다.
  • 상속받아 만들어진 클래스는 수퍼클래스의 기능을 포함하여 구현 되었으므로 수퍼클래스에서 정의한 부분만 따로 넘겨줄 수 있다.

 

 

2-1)  Anonymous Object  ( 익명 객체 )로 옵저버 패턴 구현 


  
fun main() {
EventPrinter().start()
}
interface EventListener {
fun onEvnet(count: Int)
}
class Counter(var listener:EventListener) {
for(i in 1..100){
if(i%5 == 0) listener.onEvent(i)
}
}
class EventPrinter {
fun start() {
// 인터페이스를 구현한 객체를 코드 중간에서도 '즉시 생성'하여 사용 가능
val counter = Counter(object: EventListener {
override fun onEvent(count: Int) {
print("${count}-")
}
})
counter.count()
}
}

 

반응형