본문 바로가기
안드로이드/코틀린

코틀린 데이터 변경 감지 : 프로퍼티 위임(Delegated Properties)

by 시작이반의반 2024. 5. 8.

프로퍼티 위임

 

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

 

Delegated properties | Kotlin

 

kotlinlang.org

댓글