PHpullh
학습 라이브러리/Kotlin/옵저버 패턴 (Observer Pattern)

KOTLIN · 객체지향

옵저버 패턴 (Observer Pattern)

이벤트 발생 시 등록된 관찰자들에게 알림을 전달하는 패턴입니다. Kotlin의 고차 함수와 위임을 활용하여 간결하게 구현합니다.

객체지향중급observerevent-emitterlistenerpublish-subscribe

핵심 설명

이벤트 발생 시 등록된 관찰자들에게 알림을 전달하는 패턴입니다. Kotlin의 고차 함수와 위임을 활용하여 간결하게 구현합니다.

Kotlin code

class EventEmitter<T> {
    private val listeners = mutableListOf<(T) -> Unit>()

    fun on(listener: (T) -> Unit) { listeners.add(listener) }
    fun off(listener: (T) -> Unit) { listeners.remove(listener) }
    fun emit(event: T) { listeners.forEach { it(event) } }
    fun clear() { listeners.clear() }
}

data class UserEvent(val type: String, val userId: String)

class UserService {
    val events = EventEmitter<UserEvent>()

    fun createUser(id: String) {
        println("사용자 생성: $id")
        events.emit(UserEvent("CREATED", id))
    }

    fun deleteUser(id: String) {
        println("사용자 삭제: $id")
        events.emit(UserEvent("DELETED", id))
    }
}

fun main() {
    val service = UserService()
    service.events.on { e -> println("로그: ${e.type} - ${e.userId}") }
    service.events.on { e ->
        if (e.type == "CREATED") println("환영 이메일 발송: ${e.userId}")
    }
    service.createUser("user-001")
    service.deleteUser("user-001")
}

학습 팁

리스너를 제거하려면 람다를 변수에 저장해야 합니다. 익명 람다는 참조가 달라 off로 제거할 수 없습니다.

주의할 점

이벤트 핸들러에서 예외가 발생하면 나머지 핸들러가 호출되지 않습니다. 각 핸들러를 try-catch로 감싸는 것을 고려하세요.

자주 묻는 질문

옵저버 패턴 (Observer Pattern)란 무엇인가요?

이벤트 발생 시 등록된 관찰자들에게 알림을 전달하는 패턴입니다. Kotlin의 고차 함수와 위임을 활용하여 간결하게 구현합니다.

옵저버 패턴 (Observer Pattern) 학습 시 주의할 점은 무엇인가요?

이벤트 핸들러에서 예외가 발생하면 나머지 핸들러가 호출되지 않습니다. 각 핸들러를 try-catch로 감싸는 것을 고려하세요.