우찬쓰 개발블로그

코틀린/안드로이드 변수 변경 감지 본문

안드로이드/코틀린

코틀린/안드로이드 변수 변경 감지

이우찬 2019. 3. 6. 11:18
반응형

클래스에 변수(이하 프로퍼티)로 선언한 값이 바뀔때 감지하고 싶은 경우가 있다.


RxJava를 통해 직접 구현할 수도 있겠지만 코틀린에서는 기본문법으로 제공하고 있다.




한 상황을 예를들어보자.


<변수값이 변경될때마다 감지하여 예전값과 현재값을 알고싶다>




이 상황은 간단한 상황이다보니 '그냥 메소드로 만들어서 처리하면 되겠는데?' 라고 생각 할 수도 있지만 


실제 개발에서 더 복잡한 상황이 된다면 여기저기서 메소드를 호출하고 난잡해 지는 상황이 올 수 있다.


뿐만 아니라 프로퍼티 값에따라 여러 로직을 처리하고 싶을때도 있고 그 로직을 여기저기서 컨트롤 하기에는 스파게티 소스가 되어버릴 수 있다.


이런경우를 대비하여 프로퍼티 값 변경 감지를 위한 소스를 짜보자.


class Test {
var something: String by Delegates.observable("initValue") { props, old, new ->

//원하는 로직 처리를 자유롭게 한다.
println("oldValue: $old")
println("newValue: $new")
}
}


initValue에는 초기화값이 들어가고, 람다 표현식 안에서 원하는 로직 처리를 자유롭게 할 수 있다.


실제로 something 값을 변경할 때마다 정상적으로 값이 출력되는 것을 볼 수 있다.




위 수준으로도 만족스러운 기능이지만 추가적 기능을 제공하는 문법이 또 있다.


예를들어 프로피터 값을 변경하려고 할때 특정값이면 변경되고, 그렇지않으면 변경하고 싶지 않을 수 있다.


이런경우는 Delegates.vetoable을 이용한다.


class Test {
var something: String by Delegates.vetoable("initValue") { property, oldValue, newValue ->

//문자열 길이가 10을 넘어가면 변경하지 않는다.
if(newValue.length >10) false
else true
}
}


위 람다 표현식에서 true를 리턴하면 값이 변경되는 것이고, false를 리턴하면 값을 변경하지 않는 것이다.

반응형

'안드로이드 > 코틀린' 카테고리의 다른 글

value로 부터 enum class 찾기  (0) 2019.07.30
코틀린 foreach의 break, continue  (0) 2018.12.13
Comments