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()
	}
}

 

반응형