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()
}
}
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin] Fragment Navigation 화면 전환 방법 (0) | 2022.11.02 |
---|---|
[Kotlin] RecyclerView 사용 방법 (0) | 2022.10.31 |
[Android] 앱 런처(앱 아이콘, 앱 이름, 패키지 이름 변경 ) 사용 방법 (0) | 2022.10.04 |
[Kotlin] 뷰 바인딩(ViewBinding) 사용 방법 (0) | 2022.09.28 |
[Kotlin] 범위형(for) / 조건형(while) 반복분 (0) | 2022.09.27 |