본문 바로가기
Android

Android MutableData와 LiveData의 차이점

by kkong93 2023. 5. 19.
반응형

MutableLiveData와 LiveData는 Android에서 데이터를 관찰하고 UI를 업데이트하는 데 사용되는 클래스입니다. 이 두 클래스는 모두 Android Architecture Components의 일부입니다.

 

LiveData:

LiveData는 데이터를 관찰하고 UI를 업데이트하는 데 사용되는 데이터 홀더 클래스입니다. LiveData는 생명주기를 인식하므로, 이를 사용하면 앱의 생명주기와 관련된 문제를 피할 수 있습니다. LiveData는 활성 상태인 관찰자만 업데이트하므로, 앱이 백그라운드에 있거나 액티비티가 종료된 경우 메모리 누수를 방지할 수 있습니다.

 

MutableLiveData:

MutableLiveData는 LiveData의 하위 클래스로, 값을 변경할 수 있는 LiveData입니다. LiveData는 추상 클래스이므로 직접 인스턴스화할 수 없습니다. 따라서 값을 변경하려면 MutableLiveData를 사용해야 합니다.

 

차이점:

LiveData는 값을 변경할 수 없지만, MutableLiveData는 값을 변경할 수 있습니다. 이는 LiveData가 불변성을 유지하도록 설계되었기 때문입니다. MutableLiveData는 LiveData에 값을 설정하고 변경하는 메서드를 추가로 제공합니다.

 

class MyViewModel : ViewModel() {
    private val _name = MutableLiveData<String>()
    val name: LiveData<String> get() = _name
}

 

 

여기서 _name은 MutableLiveData 인스턴스이며, 이를 통해 값을 변경할 수 있습니다. name은 LiveData 타입으로, 이를 통해 값을 관찰할 수 있습니다.

 

class MyViewModel : ViewModel() {
    private val _name = MutableLiveData<String>()

    fun setName(newName: String) {
        _name.value = newName
    }
}

여기서 _name은 MutableLiveData 인스턴스이며, setName 메서드를 통해 _name의 값을 변경할 수 있습니다. 이렇게 하면 _name의 값을 관찰하고 있는 모든 관찰자가 알림을 받고 UI를 업데이트할 수 있습니다.

 


보통 두가지를 함께 사용해 데이터를 불변성을 유지하고 업데이트 해줍니다.

class MyViewModel : ViewModel() {
    // MutableLiveData instance
    private val _count = MutableLiveData<Int>()

    // Expose LiveData, not MutableLiveData
    val count: LiveData<Int> get() = _count

    init {
        _count.value = 0
    }

    fun incrementCount() {
        _count.value = (_count.value ?: 0) + 1
    }
}

이 예시에서는 _count라는 MutableLiveData 인스턴스를 생성하고 초기화합니다. 그런 다음 count라는 LiveData를 통해 _count를 외부에 노출합니다. 이렇게 하면 외부에서는 count를 관찰하고 변경사항을 받을 수 있지만, count의 값을 직접 변경할 수는 없습니다. 이는 LiveData의 불변성을 유지하면서도, 필요한 경우에만 값을 변경할 수 있도록 합니다.

 

incrementCount 메서드를 통해 _count의 값을 변경할 수 있습니다. 이 메서드를 호출하면 _count의 값이 증가하고, 이를 관찰하고 있는 모든 관찰자가 알림을 받아 UI를 업데이트할 수 있습니다. 이렇게 하면 앱의 생명주기와 관련된 문제를 피하면서도, 데이터의 변경사항을 안전하게 관찰하고 반영할 수 있습니다.

반응형

댓글