KOTLIN · 디자인패턴
Delegation 패턴 — by
by 키워드로 보일러플레이트 없이 위임 패턴을 구현합니다.
디자인패턴중급bydelegationobservablevetoableproperty-delegate
핵심 설명
by 키워드로 보일러플레이트 없이 위임 패턴을 구현합니다.
Kotlin code
import kotlin.properties.Delegates
// 인터페이스 위임
interface Logger {
fun log(msg: String)
}
class ConsoleLogger : Logger {
override fun log(msg: String) = println("[LOG] $msg")
}
// by로 모든 Logger 메서드를 ConsoleLogger에 위임
class UserService(logger: Logger) : Logger by logger {
fun createUser(name: String) {
log("사용자 생성: $name") // 위임된 메서드
}
}
// 프로퍼티 위임
class UserPrefs {
// observable — 값 변경 감지
var theme: String by Delegates.observable("light") { _, old, new ->
println("테마 변경: $old → $new")
}
// vetoable — 조건 불만족 시 변경 거부
var fontSize: Int by Delegates.vetoable(14) { _, _, new ->
new in 8..32 // 8~32 범위만 허용
}
// Map 위임 (JSON 파싱 패턴에 유용)
val data = mapOf("name" to "Alice", "age" to "30")
val name: String by data
val age: String by data
}
fun main() {
val svc = UserService(ConsoleLogger())
svc.createUser("Bob")
val prefs = UserPrefs()
prefs.theme = "dark" // 테마 변경: light → dark
prefs.fontSize = 50 // 거부됨 (범위 초과)
println(prefs.fontSize) // 여전히 14
println("${prefs.name}, ${prefs.age}")
}학습 팁
커스텀 프로퍼티 위임을 만들려면 ReadOnlyProperty 또는 ReadWriteProperty 인터페이스를 구현하세요.
주의할 점
Delegates.observable은 변경 후 콜백, Delegates.vetoable은 변경 전 콜백입니다. 순서를 헷갈리지 마세요.
자주 묻는 질문
Delegation 패턴 — by란 무엇인가요?
by 키워드로 보일러플레이트 없이 위임 패턴을 구현합니다.
Delegation 패턴 — by 학습 시 주의할 점은 무엇인가요?
Delegates.observable 은 변경 후 콜백, Delegates.vetoable 은 변경 전 콜백입니다. 순서를 헷갈리지 마세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.