Sam Story

Observer 패턴 본문

개발지식

Observer 패턴

Sam H 2025. 2. 12. 18:55

오늘은 Observer 패턴에 대해서 포스팅 해보려 한다.

MVVM 패턴을 적용해 개발을 할 때 LiveData를 Observe하여 상태변화를 감지해

UI에 변화를 줬었는데 근간이 되는 Observer패턴에 대한 공부가 부족한 것 같아서

포스팅을 남겨본다.

 

Observer 패턴이란?

Observer 패턴은 객체지향 프로그래밍에서 주체(Subject) 객체의 상태 변화가 있을 때,

그 상태를 관찰자(Observer) 객체들에게 자동으로 알리는 디자인 패턴이다.

이 패턴은 객체 간의 일대다 의존 관계를 정의하여,

주체 객체의 상태가 변화할 때마다 그와 관련된 모든 관찰자 객체들이 자동으로 갱신될 수 있도록 한다.

 

 

왜 Observer 패턴을 사용하는가?

Observer 패턴을 사용하는 주요 이유는 객체 간의 의존성을 최소화하고,

상태 변화에 대한 반응을 유연하게 처리할 수 있기 때문이다.

 

이 패턴을 사용하면 한 객체(주체)의 상태 변화에 대해 여러 객체(관찰자)가 자동으로 반응할 수 있도록 할 수 있다.

이를 통해 코드의 확장성유지보수성을 높일 수 있다.

 

상태 변화에 대한 반응을 자동화하고,

객체 간의 결합도를 낮추어 유연하고 확장 가능한 시스템을 만들 수 있게 해준다.

시스템이 커질수록 이러한 장점이 더 두드러지며,

복잡한 시스템에서도 효과적으로 상태 변화를 관리하고 유지보수할 수 있다.

 

구성요소

Observer패턴은 크게봤을 때 2가지 구성요소로 이루어진다.

 

1. Subject (주체) : 상태를 가지고 있고, 상태 변화가 있을 때 Observer에게 그 변화를 알리는 역할을 한다.

 

2. Observer (관차자) : 주체의 상태 변화를 감지하고 알림을 받아 반응하는 역할을 한다.

 

크게 봤을 때에는 2가지 구성요소 이지만 Subject와 Observer를 상위요소로 구성하고 하위요소로

구체적인 Subect와 Observer를 구현할 수도 있다.

 

예제

오늘의 예제는 LiveData를 이용한 EditText에 입력한 Text가 TextView에 갱신되는 간단한 예제이다.

LiveData를 이용하기에 Subject의 역할은 ViewModel이 수행하고

LiveData가 주체의 상태를 나타낸다.

이러한 LiveData의 값이 변경될 때 이를 관찰하는 Observer에게 알린다.

 

이번 예제에서의 Observer는 MainActivity가 Observer역할을 한다.

LiveData의 observe() 메서드를 통해 데이터를 관찰하고, 데이터가 변경될 때마다 UI를 갱신하는 역할을 한다.

 

ViewModel

class WeatherViewModel: ViewModel() { // Subject

    // 주체의 상태
    private val _temperature = MutableLiveData<Int>(0)
    val temperature get() = _temperature

    fun updateTemperature(newTemperature: Int) {
        _temperature.value = newTemperature
    }
}

 

 

MainActivity

class MainActivity : AppCompatActivity() { // Observer

    private lateinit var weatherViewModel: WeatherViewModel

    private lateinit var textView: TextView
    private lateinit var editText: EditText
    private lateinit var button: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // UI
        textView = findViewById(R.id.textView)
        editText = findViewById(R.id.editText)
        button = findViewById(R.id.button)

        // viewModel 초기화
        weatherViewModel = ViewModelProvider(this)[WeatherViewModel::class.java]

        // liveData 관찰
        weatherViewModel.temperature.observe(this, Observer { temperature ->
            textView.text = "현재 온도 : $temperature"
        })

        button.setOnClickListener {
            weatherViewModel.updateTemperature(editText.text.toString().toInt())
        }
    }
}

 

 

실행결과

실행결과

 

 

간단한 예제를 통해서 Observer패턴을 이용해 구성요소들의 상호작용과

변화된 상태를 감지해 UI가 갱신되는 예제를 만들어 보았다.

 

 

'개발지식' 카테고리의 다른 글

Singletone Pattern (싱글톤 패턴)  (2) 2024.12.06
자바 버전에 대하여 (8 , 11 , 17)  (1) 2024.12.02
객체지향 프로그래밍 SOLID 원칙  (1) 2024.09.24
객체지향 프로그래밍  (5) 2024.09.23
REST,REST API  (0) 2024.08.21