PHpullh
학습 라이브러리/Kotlin/Delegation 패턴 — by

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 은 변경 전 콜백입니다. 순서를 헷갈리지 마세요.