Kotlin 강좌 17 - 익명객체와 옵저버 패턴

dyeon-dev·2023년 10월 15일
0

Kotlin

목록 보기
11/17

옵저버 패턴

함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들을 '이벤트'라고 부르며,
이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴

두 개의 클래스 필요 -> 이벤트 수신, 이벤트의 발생 및 전달

인터페이스만 알아도 이벤트를 넘겨줄 수 있다. 이때 이 인터페이스를 'observer', 코틀린에서는 'listener'라고 부른다. 이벤트를 넘겨주는 행위를 'callback'이라고 한다.

fun main() {
    val eventPrinter = EventPrinter() // Create an instance of EventPrinter
    eventPrinter.start() // Call the start method on the instance
}

// 이 두개를 연결시킨 인터페이스 EventListener
interface EventListener {
	// 리스너를 통해 이벤트를 반환하는 함수 이름은 on(행위)라는 규칙을 따른다. 
    fun onEvent(count: Int)
}

// 숫자를 카운트하며 5의 배수마다 이벤트를 발생시킬 클래스 Counter
class Counter(var listener: EventListener) {
    fun count() {
        for(i in 1..100) {
            if(i%5==0) listener.onEvent(i)
        }
    }
}
// 이벤트를 수신해서 출력하는 클래스 EventPrinter
class EventPrinter : EventListener { // Implement the onEvent method
    override fun onEvent(count: Int) {
        print("${count}-")
    }

    fun start() {
        val counter = Counter(this) // EventPrinter 객체 자신을 나타내지만 받는쪽에서 'EventListener'만 요구했기 때문에 'EventListener' 구현부만 넘겨주게 된다(객체지향의 다형성)
        counter.count() // Call the count method
    }
}

5-10-15-20-25-30-35-40-45-50-55-60-65-70-75-80-85-90-95-100-

익명객체

EventPrinter가 EventListener를 상속받아 구현하지 않고 임시로 만든 별도의 EventListener 객체를 대신 넘겨줄수도 있다. 이것을 이름이 없는 객체라 하여 익명 객체라고 한다.

// 이벤트를 수신해서 출력하는 클래스 EventPrinter
class EventPrinter { // Implement the onEvent method
    fun start() {
        val counter = Counter(object: EventListener {
            override fun onEvent(count: Int) {
        	print("${count}-")
    		}
        })
        counter.count() // Call the count method
    }
}

0개의 댓글