이전 게시물의 후속 편입니다.
이전 게시물이 궁금하시면 아래 링크를 통해 확인해주세요.
[Android/Kotlin] ViewModelFactory를 사용하자!
저번 시간에 ViewModel에 대해 알아보았는데요, 이전 시간 게시글을 보지 못한 분들을 위해 아래에 이전 시간에 작성한 게시글 링크를 달아놓겠습니다. https://minhyuuk.tistory.com/6 [Android/Kotlin] 예제를.
minhyuuk.tistory.com
오늘은 Android에 많이 사용되는 LiveData에 대해 알아보겠습니다.
그럼 LiveData가 뭘까요? 살아 있는 데이터?
LiveData는 수명 주기를 인식하는 데이터 홀더 클래스입니다.
RxJava와 같은 Observable을 형태로 사용하며
안드로이드 Lifecycle에 따라 데이터를 관리합니다.
수명 주기가 있는 앱 구성 요소는 3개가 있죠.
(Activity Fragment Services)
위와 같은 라이프 사이클을 따르기에
활동에 대한 처리를 알아서 하는 게 장점이기도 합니다.
또한 ViewModel을 함께 활용하면 최신 데이터를 유지하기 편해집니다.
제가 정리한 장점들은 다음과 같습니다.
- 메모리 누수 없음
- 중지된 활동으로 인한 비정상 종료 없음
- 수명 주기를자동으로 알아서 처리함
- ViewModel을 함께 활용하면 최신 데이터 유지가 편해짐
그럼 이제 LiveData를 사용해볼까요?
LiveData 사용법?
종속성
dependencies{
...
implementation 'androidx.appcompat:appcompat:1.4.1'
// 이미 기본적으로 가지고 있으신 분들이 많습니다.
// 이 종속성이 LiveData를 사용하게 해주는구나~
// 라는 것만 알고 가시면 좋을 것 같습니다.
...
}
MainActivityViewModel.kt
package com.app.databinding
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class MainActivityViewModel(startingTotal : Int) : ViewModel() {
var total = MutableLiveData<Int>()
init {
total.value = startingTotal
}
// 숫자를 더할 때 사용할 함수
fun setTotal(input : Int){
total.value = (total.value)?.plus(input)
}
}
MutableLiveData와 LiveData는 차이가 있습니다.
Mutable은 안드로이드에서 많이 볼 수 있습니다.
변경이 가능하다는 뜻이며 값을 get 하고 set 할 수 있습니다.
하지면 LiveData는 읽기 가능한 데이터를 만들기에
값은 변경이 불가능합니다.
total형은 MutableLiveData이므로 value를 가져와 plus함수를 사용해
값을 더하였습니다.
MainActivity.kt
package com.app.databinding
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import com.app.databinding.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
// 나중에 정의한 변수들을 lateinit var로 선언
private lateinit var binding: ActivityMainBinding
private lateinit var viewModel: MainActivityViewModel
private lateinit var viewModelFactory: MainActivityViewModelFactory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// databinding 적용.
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
viewModelFactory = MainActivityViewModelFactory(startingTotal = 100)
// viewModel의 주최를 MainActivityViewModel로 설정
viewModel = ViewModelProviders.of(this,viewModelFactory).get(MainActivityViewModel::class.java)
// binding.textSum.text = viewModel.getTotal().toString()
// 위의 코드를 livedata 사용하여 아래로 변경
viewModel.total.observe(this, Observer {
binding.textSum.text = it.toString()
})
binding.buttonCount.setOnClickListener {
// setTotal()을 호출해 edittext의 값을 total에 더한다.
viewModel.setTotal(binding.countEditText.text.toString().toInt())
}
}
}
위에서 볼 수 있듯 observe를 사용해 합계를 더하는 구문을 이렇게 처리했습니다.
binding.textSum.text = viewModel.getTotal().toString()
-> binding.textSum.text = it.toString()
나머지는 저번 시간과 같은 구문입니다.
ViewModel로 값이 사라지지 않게 만들었죠.
그럼 이제 실행 화면을 보실까요??
정상적으로 작동이 되는 걸 확인할 수 있네요!!
하지만 이 코드는 문제가 있습니다.
자세히 보시면 MainActivityViewModel의 변수,
total을 public 하게 접근할 수 있습니다.
이건 좋은 코딩 습관이 아니죠.
그러므로 이제는 캡슐화한 데이터에
어떻게 접근하는지에 대해 알려드리도록 하겠습니다.
MainActivityViewModel.kt
private var total = MutableLiveData<Int>()
val totalData : LiveData<Int>
get() = total
(수정한 부분은 변수 선언 부분입니다.)
일단 private로 변수를 캡슐화합니다.
totalData를 LiveData로 선언합니다.
MutableLiveData는 LiveData의 서브 클래스이므로
get()을 통해 total을 MutableLiveData인 total을 받아올 수 있습니다.
MainActivity.kt
viewModel.totalData.observe(this, Observer {
binding.textSum.text = it.toString()
})
이미 위에서 캡슐화하는 과정을 거쳤으므로
total을 totalData로 수정하면 끝입니다.
수정된 실행 화면도 위의 캡슐화하기 전 화면과 동일합니다.
참 쉽죠?
이 글을 마치며
LiveData에 알아보았는데요, 아직 개념 정리하는 능력이 부족해 이해하기 힘드실 수도 있습니다.
그 점 이해해주셨으면 감사하겠습니다. 그럼 다음 시간에 다른 게시물로 찾아뵙겠습니다.
감사합니다 🤗
참고
LiveData 개요 | Android 개발자 | Android Developers
LiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.
developer.android.com
Android LiveData의 사용법과 내부 코드를 통한 UI 처리, 중복 처리 등 살펴보기 |
I’m an Android Developer.
thdev.tech
[Kotlin] 코틀린 뽀개기 - 객체지향의 핵심 '캡슐화'
하이~~!! 오늘은 객체지향 언어를 공부하는 사람이라면 꼭 알아야할 내용인 캡슐화에 대해 공부해보려한다. 캡슐화없는 객체지향은 앙꼬 없는 찐빵이다. 갑자기 찐빵이 먹고싶다. 캡슐화 클래스
devkingdom.tistory.com
'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] ViewModelFactory를 사용하자! (0) | 2022.04.20 |
---|---|
[Android/Kotlin] RecyclerView에 대해 알아보자! (0) | 2022.03.26 |
[Android/Kotlin] Intent를 사용하자! (0) | 2022.03.25 |
[Android/Kotlin] Collection에 대해 알아보자 (0) | 2022.03.22 |