본문 바로가기
오늘은 뭘 배울까?/Android

Observable Field와 LiveData의 차이가 무엇인가요?

by Kim Juhwan 2022. 7. 9.

1. 요약
2. LiveData
3. Observable
   3-1. 개념
   3-2. 사용법

4. 그래서 둘의 차이는?
5. LiveData가 무조건 좋은 걸까?

 

 

 


 

 

1. 요약

🧑‍💻: LiveData와 Observable Field의 차이가 무엇인가요?

 

👨🏻‍🦱: LiveData는 수명주기를 알고 있기 때문에 observer를 자동으로 관리하지만
Observable Field는 수명주기를 알지 못해 수동으로 관리해주어야 합니다.
그렇기 때문에 메모리 누수 면에서 LiveData가 유리하다고 할 수 있습니다.

 

2. LiveData

LiveData는 Jetpack에서 지원하는 라이브러리이며

데이터를 관찰하고 있다가 변경 사항이 생기면 알려주는 아주 기똥찬 녀석이다.

 

LiveData에 대해서는 정리해둔 게시글이 있으므로 여기에서 자세한 설명은 생략한다.

 

3. Observable

3-1. 개념

 

ObservableField에 대해 이야기하기 전에 Observable에 대해 알아보자.

우선, Observable은 interface이다.

그리고 Observable을 구현한 클래스들은

LiveData처럼 변경 사항을 알릴 수 있는 방법을 제공하는, 관찰 가능한 클래스가 된다.

 

public interface Observable {

    /**
     * Adds a callback to listen for changes to the Observable.
     * @param callback The callback to start listening.
     */
    void addOnPropertyChangedCallback(OnPropertyChangedCallback callback);

    /**
     * Removes a callback from those listening for changes.
     * @param callback The callback that should stop listening.
     */
    void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback);

    /**
     * The callback that is called by Observable when an observable property has changed.
     */
    abstract class OnPropertyChangedCallback {

        /**
         * Called by an Observable whenever an observable property changes.
         * @param sender The Observable that is changing.
         * @param propertyId The BR identifier of the property that has changed. The getter
         *                   for this property should be annotated with {@link Bindable}.
         */
        public abstract void onPropertyChanged(Observable sender, int propertyId);
    }
}

 

Observable은 이렇게 생겼고 OnPropertyChangedCallback을 통해서 변경사항을 알릴 수 있다.

좋다. 그럼 Observable을 구현한 클래스들이 있다고 했는데 어떤 놈들일까?

 

  • ObservableField
  • ObservableBoolean
  • ObservableByte
  • ObservableChar
  • ObservableShort
  • ObservableLong
  • ObservableFloat
  • ObservableDouble
  • ObservableParacelable

바로 요놈들이다.

정확히 말하면 Observable을 직접 구현하지는 않고

이 놈들이 BaseObservableField를 상속받고

BaseObservableField는 BaseObservable을 상속받고

BaseObservable이 Observable을 구현한다.

 

아무튼! 이런 클래스들이 있다.

오늘 포스팅 질문이 LiveData와 ObservableField의 차이점을 묻는 것인데, 사실 이 모든 클래스들과의 차이점이라고 봐도 된다.

 

3-2. 사용법

class MainActivity : AppCompatActivity() {
    private val observableField = ObservableField("default")
    private val liveData = MutableLiveData("default")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        observableField.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
            override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
                // 데이터 변경 감지시 할 작업
            }
        })

        liveData.observe(this) {
            // 데이터 변경 감지시 할 작업
        })
    }
}

ObservableField와 LiveData의 사용법을 비교해보기 위해 위 코드를 작성해보았다.

 

observableField.set("new value")

livedata.value = "new value"

값을 변경할 때는 이렇게 하면 된다.

데이터바인딩 등 보다 더 자세한 사용법은 여기에서 확인할 수 있다.

 

4. 그래서 둘의 차이는?

둘의 차이는 수명주기를 인식하느냐 못하느냐의 차이이다.

 

LiveData의 가장 큰 장점은 수명주기를 알고 있다는 것이다.

수명주기를 알고 있기 때문에 수명주기에 맞게 observer를 알아서 자동으로 관리한다.

 

하지만 ObservableField는 수명주기를 알지 못한다.

그렇기 때문에 수동으로 Observer를 관리해주어야 하고 만약 제어하지 않으면 리소스가 낭비된다.

ex) activity가 종료되었는데도 관찰자가 계속 데이터를 관찰하고 있기 때문에 리소스가 낭비된다

 

        observableField.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
            override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
                // 데이터 변경 감지시 할 작업
            }
        })

        liveData.observe(this) {
            // 데이터 변경 감지시 할 작업
        })

[목차 3-2]에서 봤던 코드를 다시 보면 LiveData를 사용할 때 this를 넘겨주는데

이 값을 통해 LiveData는 수명주기를 알 수 있다.

 

5. LiveData가 무조건 좋은 걸까?

 

https://developer.android.com/topic/libraries/data-binding/observability

 

LiveData가 더 최근에 발표되기도 했고, 장점도 가지고 있다.

또, Observable에 대해 설명하고 있는 안드로이드 공식문서에서는

Observable을 대체할 수 있고 이점이 있는 LiveData가 있으니 참고해봐! 라고 적혀있다.

 

그래서 궁금증이 생겼다. 무조건 LiveData를 쓰는 게 좋은 걸까?

이에 대해 확실한 정답은 찾지 못했지만 추측컨데 LiveData는 일반적인 경우에 추천되는 옵션 정도로 말할 수 있을 것 같다.

수명주기에 맞게 자동으로 관리해준다는 것은 개발자의 일을 덜어주는 확실히 좋은 장점이다.

특별한 경우가 아니라면 LiveData를 사용하는 게 유리하겠으나

아직까지 ObservableField가 deprecated 되지 않은 데는 다 이유가 있지 않을까 싶다.

 

또, stackoverflow를 둘러봐도

"둘 다 사용 가능하고 LiveData는 이런 장점들이 있어"

"반드시 LiveData를 사용해야 하는 건 아니야. 하지만 LiveData를 추천할게" 정도의 의견이 다수이다.

 

LiveData를 사용하되 Observable에 대해서 알아두는 정도가 좋을 것 같다.

 

 

 


💡 느낀 점

  • 예전에 Delegate에 대해 공부할 때 Observable이랑 Vetoable에 대해서 배운 적이 있는데 그거랑은 이름만 같고 또 다른 개념인 걸까? 헷갈린다 😵‍💫 다음엔 이거에 대해서 정리해봐야겠다.
  • 수명주기를 자동으로 관리해준 다는 점이 큰 장점이긴 하지만 사실 그냥 사용하는 거 자체도 LiveData가 편한 것 같다.

📘참고한 자료


 

 

반응형

댓글