[Kotlin] Observer 패턴(옵저버 패턴) 설명 & 예제

728x90

Observer(옵저버) 패턴

  • 이벤트가 발생하는 것을 '감시' 하는 감시자의 역할을 만든다고 해서 옵저버라고 부름
  • 안드로이드의 예라면
    • 키의 입력
    • 터치의 발생
    • 데이터 수신
  • 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들을 이벤트라고 한다.
  • 이러한 이벤트가 발생할 때마다 '즉각적으로 처리' 할 수 있도록 만드는 프로그래밍 패턴을 '옵저버 패턴' 이라고 함

Observer(옵저버) 패턴을 구현하기 위해서는 두개의 클래스가 필요함

  1. 이벤트를 수신
  2. 이벤트의 발생 및 전달

두 클래스간의 통신하는 방법 : 인터페이스 'observer' 이용
코틀린에서는 listener 라고 함
-> 이렇게 이벤트를 넘겨주는 행위를 CallBack 이라고함

//class EventPrinter : 이벤트를 수신해서 출력
//class Counter : 숫자를 카운트 하며 5의 배수마다 이벤트를 발생 시킬 Counter

//위 두개를 연결 할 interface : EventListener
fun main() {
    //1. Counter가 5의 배수마다 이벤트를 발생시킴
    //2. EventPrinter 내에서 구현된 EventListener에서 출
    EventPrinter().start()
}

//이벤트가 발생할 때 숫자를 반환
interface EventListener {
    fun onEvent(count: Int)
}

//이벤트가 발생하는 Counter
class Counter(var listener: EventListener) { //생성자에서 EventListener 를속성으로 받는다
    fun count() {
        for (i in 1..100) {
            if (i % 5 == 0) {
                listener.onEvent(i)
            }
        }
    }
}

//이벤트를 받아서 화면에 출력할 Event Printer
class EventPrinter: EventListener {
    override fun onEvent(count: Int) {
        print("${count}-")
    }

    fun start(){
        //EventListener 구현부 넘겨준다
        //this는 EventPrinter 의미 하지만 받는 쪽에서 EventListener 만요구 -> 구현부만 넘겨준다
        //이를 객체 지향의 다형성이라고 한다
        val counter = Counter(this)
        counter.count()
    }
}

익명함수 사용 버전 : EventPrinter

class EventPrinter {
    fun start(){
        val counter = Counter(object: EventListener {
            override fun onEvent(count: Int) {
                print("${count}-")
            }
        })
        counter.count()
    }
}

옵저버 패턴은 이벤트 기반으로 동작하는 모든 코드에서 광범위하게 쓰이는 방식임

728x90

댓글

Designed by JB FACTORY