-
[Android/Kotlin] 옵저버 패턴이란?IT Study/Android 2024. 4. 10. 18:10728x90
1. 옵저버 패턴이란
옵저버 패턴은 객체 지향 프로그래밍에서 중요한 디자인 패턴 중 하나이다.
옵저버 패턴에 대해 알아보기 전, 먼저 옵저버가 무엇인지 생각해보자. Observer(이하 옵저버)란, 감시자 혹은 관찰자를 의미한다.
말 그대로 무언가를 감시하는 역할을 수행하고 있다는 것. 즉, 어떤 이벤트가 일어나는 것을 감시하는 패턴을 의미한다.마치 안드로이드 리스너와 같은 개념 아닌가?
1. 버튼을 클릭했을 때
2. 키보드를 통해 글자를 입력할 때
3. API 콜에 대한 응답 데이터를 수신받았을 때시스템에 의해 발생하는 동작, 이벤트가 발생했을 때 이를 감시하고 미리 정의된 동작을 수행하도록 하는 것이 바로 옵저버 패턴이다. 그렇다면 옵저버 패턴은 어떤 원리로 동작하는 것일까?
미리 힌트를 주자면,
옵저버 패턴은 관찰보다 이벤트가 발생했음을 나타내는 정보를 전달받기를 기다리는 것이다. 옵저버, 관찰자라는 단어에서 주는 느낌은 마치 대상을 감시하고 있는 듯하지만, 사실은 이벤트가 발생했음을 전달 받기를 기다리고 있는 것이다.2. 옵저버 패턴의 구현
옵저버 패턴을 구현하기 위해서는, 관찰 대상인 "Subject"와 관찰자인 "Observer" 그리고 이들을 연결하는 "리스너"가 필요하다.
관찰대상 <- 리스너 -> 옵저버
2-1. 리스너 인터페이스 정의
// 리스너 인터페이스 정의 interface ButtonClickListener { fun onClick(eventInfo: String) }
ButtonClickListener 인터페이스는 버튼 클릭 이벤트를 처리하기 위한 onClick() 메서드을 정의한다.2-2. 관찰대상 클래스 정의
// 관찰대상 클래스 정의 class Button { var listener: ButtonClickListener? = null fun click() { println("버튼이 클릭되었습니다.") listener?.onClick("Button Clicked") } fun addClickListener(listener: ButtonClickListener) { this.listener = listener } }
Button 클래스는 클릭 이벤트 발생 시 리스너의 onClick() 메서드를 호출해 이벤트 정보를 전달한다.
addClickListener() 메서드는 ButtonClickListener를 Button 객체에 등록하는 기능을 한다.2-3. 옵저버 클래스 정의
class Activity : ButtonClickListener { override fun onClick(eventInfo: String) { println("Activity에서 이벤트 처리: $eventInfo") } }
Activity 클래스는 ButtonClickListener 인터페이스를 상속한다. 이를 통해 버튼 클릭 이벤트가 발생했을 때 수신하고 처리한다.2-4. main 함수에서 실행하기
fun main() { val button = Button() val activity = Activity() // 리스너 등록 button.addClickListener(activity) // 버튼 클릭 이벤트 발생 button.click() }
main 함수에서는 Button (관찰대상)와 Activity (옵저버) 인스턴스를 생성하고, Activity를 Button의 리스너로 등록한다.
버튼이 클릭되면 (button.click() 호출 시), Button 인스턴스는 리스너(Activity 인스턴스)의 onClick() 메소드를 호출한다. 이를 통해 Activity는 버튼 클릭 이벤트를 전달한다.3. 결론
간단히 말해, 관찰대상과 옵저버는 서로 직접 소통하지 않고, 옵저버가 만든 규칙(리스너)를 통해 간접적으로 서로의 상태나 이벤트를 전달할 수 있다. 이 패턴을 통해 이벤트 발생과 수신을 독립적으로 관리함으로써, 프로그램의 확장성과 유지보수를 용이하게 만들 수 있다.
자, 이제 옵저버 패턴을 개발에 반영해보자. 😉'IT Study > Android' 카테고리의 다른 글
[Android/Kotlin] 코틀린과 코루틴 (0) 2024.05.19 [Kotlin] 코틀린하며 가끔 잊어버리는 내용 (Feat. 개념적인 내용) (2) 2024.04.14 [Android/Kotlin] "Can't create handler inside thread that has not called Looper.prepare()" 예외 (0) 2024.04.04 [Kotlin] tailrec(꼬리 재귀)란 (0) 2024.02.03 [Android] Foreground Service를 사용하고 싶을 경우 (feat. API 레벨 34 이상) (0) 2024.01.30