함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해서 발생하게 되는 동작들을 '이벤트'라고 부르며,
이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴
두 개의 클래스 필요 -> 이벤트 수신, 이벤트의 발생 및 전달
인터페이스만 알아도 이벤트를 넘겨줄 수 있다. 이때 이 인터페이스를 '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 } }