observable과 vetoable 위임
observable로 프로퍼티 변경에 반응하고 vetoable로 조건에 따라 변경을 거부해 보세요.
observable과 vetoable 위임은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
속성 위임 복습
Kotlin의 속성 위임을 사용하면 별도의 객체가 getValue와 setValue를 처리할 수 있습니다. Delegates.observable과 Delegates.vetoable은 표준 라이브러리에 포함된 기본 위임입니다.
import kotlin.properties.Delegates
var name: String by Delegates.observable("initial") { prop, old, new ->
println("${prop.name}: $old -> $new")
}
fun main() { name = "Alice"; name = "Bob" }observable 문법
observable은 초기 값과 콜백을 받습니다. 콜백은 속성이 변경될 때마다 변경 후에 속성, 이전 값, 새 값과 함께 호출됩니다.
import kotlin.properties.Delegates
var score: Int by Delegates.observable(0) { _, old, new ->
println("Score changed from $old to $new")
}
fun main() {
score = 10
score = 25
score = 0
}UI 업데이트 트리거하기
기반 속성이 변경될 때 전체 LiveData 설정 없이도 UI 새로 고침을 트리거할 수 있어 observable 위임이 유용합니다.
import kotlin.properties.Delegates
class ViewModel {
var title: String by Delegates.observable("Loading") { _, _, new ->
println("Render: $new") // pretend this updates UI
}
}
fun main() {
val vm = ViewModel()
vm.title = "Home"
vm.title = "Settings"
}vetoable 문법
vetoable은 대입 전에 콜백을 호출합니다. 콜백이 false를 반환하면 새 값이 거부되고 이전 값이 유지됩니다.
import kotlin.properties.Delegates
var age: Int by Delegates.vetoable(0) { _, old, new ->
new >= 0 // reject negative ages
}
fun main() {
age = 25; println(age) // 25
age = -1; println(age) // 25 (rejected)
age = 30; println(age) // 30
}vetoable로 검증 결합하기
외부 검증 로직 없이 속성 수준에서 도메인 불변 조건을 적용하려면 vetoable을 사용하십시오.
import kotlin.properties.Delegates
var email: String by Delegates.vetoable("") { _, _, new ->
new.contains("@")
}
fun main() {
email = "user@example.com"; println(email) // set
email = "invalid"; println(email) // still previous
}observable로 변경 사항 기록하기
감사 기록을 위해 observable을 사용하십시오. 비즈니스 로직을 수정하지 않고도 모든 상태 전이를 자동으로 기록할 수 있습니다.
import kotlin.properties.Delegates
val log = mutableListOf<String>()
var status: String by Delegates.observable("IDLE") { _, old, new ->
log.add("$old -> $new")
}
fun main() {
status = "RUNNING"
status = "DONE"
println(log)
}클래스에서 사용하는 observable
두 위임 모두 다른 속성과 마찬가지로 클래스 본문 안에서 사용할 수 있습니다.
import kotlin.properties.Delegates
class Counter {
var count: Int by Delegates.observable(0) { _, old, new ->
if (new > old) println("Incremented to $new")
else println("Decremented to $new")
}
}
fun main() {
val c = Counter()
c.count = 5
c.count = 3
}범위 제약을 위한 vetoable
vetoable을 사용하면 숫자 속성을 유효한 범위로 제한할 수 있습니다.
import kotlin.properties.Delegates
var volume: Int by Delegates.vetoable(50) { _, _, new ->
new in 0..100
}
fun main() {
volume = 80; println(volume) // 80
volume = 150; println(volume) // 80 (rejected)
volume = 0; println(volume) // 0
}위임 연결하기
observable을 내부에서 호출하는 사용자 지정 위임을 작성하면 observable 로직을 수동으로 결합하고 각 단계에 추가 로직을 넣을 수 있습니다.
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class LoggedDelegate<T>(initial: T) : ReadWriteProperty<Any?, T> {
private var value: T = initial
override fun getValue(t: Any?, p: KProperty<*>) = value
override fun setValue(t: Any?, p: KProperty<*>, v: T) {
println("Setting ${p.name} = $v"); value = v
}
}
var x: Int by LoggedDelegate(0)
fun main() { x = 10; x = 20 }스레드 안전성 참고
observable과 vetoable 중 어느 것도 기본적으로 스레드 안전하지 않습니다. 동시에 접근하려면 뮤텍스로 변경을 보호하거나 외부에서 동기화하십시오.
import kotlin.properties.Delegates
// Not thread-safe as-is:
var sharedState: String by Delegates.observable("start") { _, old, new ->
println("$old -> $new")
}
// In coroutines, wrap access with Mutex if needed실전 패턴: 양식 검증
선언적인 양식 검증을 위해 각 필드에 vetoable을 사용하십시오. 각 필드가 대입될 때 스스로 검증합니다.
import kotlin.properties.Delegates
data class Form(
var username: String = "",
var password: String = ""
) {
var validUsername: String by Delegates.vetoable("") { _,_,v -> v.length >= 3 }
var validPassword: String by Delegates.vetoable("") { _,_,v -> v.length >= 8 }
}
fun main() {
val f = Form()
f.validUsername = "ab"; println(f.validUsername) // ""
f.validUsername = "alice"; println(f.validUsername) // "alice"
f.validPassword = "short"; println(f.validPassword) // ""
f.validPassword = "secure123";println(f.validPassword) // "secure123"
}빠른 확인
vetoable은 언제 콜백을 호출합니까?
복습
observable은 변경될 때마다 이후에 알리고, vetoable은 대입 전에 실행되어 새 값을 거부할 수 있습니다. 둘 다 외부 라이브러리 없이 기록, 검증, 반응형 속성 패턴을 구현하는 데 유용합니다.
자주 묻는 질문
“observable과 vetoable 위임” 강의는 무료인가요?
네 — “observable과 vetoable 위임” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“observable과 vetoable 위임”에서 뭘 배우나요?
observable로 프로퍼티 변경에 반응하고 vetoable로 조건에 따라 변경을 거부해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“observable과 vetoable 위임” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- by lazy: 지연 초기화 심층 학습
- observable과 vetoable 위임
- 사용자 지정 ReadWriteProperty 위임 작성하기
- 환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임