Observable Properties란 데이터의 변경을 감지하고 이를 관찰할 수 있는 기능을 제공하는 속성입니다.
대표적으로 LiveData 있지만...!
이번 글에서는 Kotlin 라이브러리에서 제공하는 프로퍼티 위임(Delegated Properties)에 대해 살펴보려고 합니다.
프로퍼티 위임에 사용되는 Delegates.observable / Delegates.vetoable에 대해 알아보고,
프로퍼티 위임과 LiveData에 대한 차이점도 간략하게 정리해보려고 합니다.
프로퍼티 위임(Delegated Properties)
프로퍼티 위임은 변수의 변경을 감지할 수 있습니다.
Delegates.observable 또는 Delegates.vetoable를 통해 콜백을 호출하여 추가적인 작업 수행이 가능합니다.
간단한 작업으로 데이터 변화를 실시간으로 관찰할 수 있으며 캡슐화하여 코드의 가독성을 높이는 특징을 가집니다.
그럼 바로 Delegates.observable / Delegates.vetoable 예시를 바로 살펴볼게요!
프로퍼티 위임 : Delegates.observable
private var isTimeOver = false
private val maxCount = 100
private var count: Int by Delegates.observable(0) { _, oldValue, newValue ->
// count 변경을 감지하고 확인 가능
println("oldValue $oldValue, newValue $newValue")
// count 변경에 대한 처리 가능
if (newValue > maxCount) {
println("The count exceeded 100 seconds!!")
isTimeOver = true
}
// UI 업데이트 가능 (주의, mainThread 동작이 보장이 안 되기 때문에 runOnUiThread 같이 따로 처리 필요)
println("currentThread ${Thread.currentThread().name}")
activity.runOnUiThread {
binding.tvCount.text = newValue.toString()
}
}
count 변수에 프로퍼티 위임 Delegates.observable를 사용한 예시입니다.
주요 내용을 살펴봅시다.
- 실시간으로 count 변경을 감지 확인
- count 변경에 대한 추가적인 작업(isTimeOver 플래그 변경) 가능
- count 변경에 대한 UI 업데이트
주의사항
Delegates.observable 콜백함수에서 UI 업데이트 시 mainThread에서 동작이 보장되지 않기 때문에
반드시 UI Thread에서 동작하도록 처리해줘야 합니다.
프로퍼티 위임 : Delegates.vetoable 사용
private var isTimeOver = false
private val maxCount = 100
private var count: Int by Delegates.vetoable(0) { _, oldValue, newValue ->
// count 변경을 감지하고 확인 가능
println("oldValue $oldValue, newValue $newValue")
// count 변경에 대한 처리 가능
if (newValue > maxCount) {
println("The count exceeded 100 seconds!!")
isTimeOver = true
return@vetoable false // 변경 거부
}
// UI 업데이트 가능 (주의, mainThread 동작이 보장이 안 되기 때문에 runOnUiThread 같이 따로 처리 필요)
println("currentThread ${Thread.currentThread().name}")
activity.runOnUiThread {
binding.tvCount.text = newValue.toString()
}
return@vetoable true // 변경 허용
}
count 변수에 프로퍼티 위임 Delegates.vetoable를 사용한 예시입니다.
Delegates.observable와 달리 변경을 허용할지 거부할지 유효성 검사가 가능합니다.
- 실시간으로 count 변경을 감지하 확인
- count 변경에 대한 추가적인 작업(isTimeOver 플래그 변경) 가능
- count 변경에 대한 UI 업데이트
- count 변경에 대한 유효성 검사
LiveData vs Delegates.observable
LiveData와 Delegates.observable 가장 큰 차이점은 아래와 같습니다.
구분 | LiveData | Delegates.observable |
생명주기 인식 (Activity, Fragment 등) |
O | X |
UI Thread 동작 보장 | O | X |
둘 다 실시간으로 데이터 변경을 감지하고 처리할 수 있는 비슷한 기능을 가지고 있지만,
확실히 LiveData가 UI와 데이터 간의 상호작용하기에 메모리 누수나 안정성이 뛰어나다고 판단됩니다.
"그럼 그냥 LiveData를 쓰면 되는 거 아닌가...?"
물론 실시간 데이터 변화에 따른 UI업데이트가 이루어져야 한다면 Delegates.observable은 적합하지 않습니다.
하지만 테스트, 디버깅 또는 간단한 작업에는 Delegates.observable이 더 간결하고 쉽게 활용될 수 있다고 생각합니다.
또한, Kotlin 표준 라이브러리에서 제공하는 만큼 Delegates.observable을 활용할 수 있는 접근성도 좋습니다.
LiveData와의 차이점을 인지하고 적절히 활용한다면 많은 이점을 가져올 수 있을 거예요.
참고자료
Kotlin : Observable Properties
'안드로이드 > 코틀린' 카테고리의 다른 글
코틀린 스레드 및 코루틴 중복 실행 방지 방법 (0) | 2024.05.14 |
---|---|
안드로이드 소수점 표기 올림? 버림? : String.format, DecimalFormat (0) | 2024.05.10 |
앱 백그라운드 상태 체크 : LifecycleEventObserver, DefaultLifecycleObserver (0) | 2024.05.07 |
안드로이드 캡처 효과 예제 : CaptureEffectView (0) | 2024.05.02 |
코틀린 화면 캡처 Canvas, PixelCopy 비교 (0) | 2024.04.30 |
댓글