0Pricing
Kotlin Academy · 강의

환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임

SharedPreferences, 맵 저장소 및 감사 로깅에 위임을 적용해 보세요.

환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

맵 기반 프로퍼티

Kotlin에서는 프로퍼티를 Map에 직접 위임할 수 있습니다. 프로퍼티를 읽으면 맵에서 해당 프로퍼티의 이름을 조회합니다.

class User(map: Map<String, Any?>) {
    val name: String by map
    val age: Int by map
}
fun main() {
    val u = User(mapOf("name" to "Alice", "age" to 30))
    println(u.name) // Alice
    println(u.age)  // 30
}

MutableMap 위임자

변경 가능한 프로퍼티의 경우 MutableMap에 위임하면 변경 내용이 기반 맵에 반영됩니다.

class Settings(private val map: MutableMap<String, Any?> = mutableMapOf()) {
    var theme: String by map
    var fontSize: Int by map
}
fun main() {
    val s = Settings()
    s.theme = "dark"
    s.fontSize = 16
    println(s.theme)    // dark
    println(s.fontSize) // 16
}

맵 위임을 사용한 JSON 역직렬화

JSON과 유사한 맵을 파싱하고 맵 위임을 사용해 해당 필드를 타입이 지정된 프로퍼티로 노출합니다. 동적 데이터에 특히 유용합니다.

class ApiResponse(data: Map<String, Any?>) {
    val id: Int by data
    val title: String by data
    val published: Boolean by data
}
fun main() {
    val response = ApiResponse(mapOf("id" to 1, "title" to "Kotlin Rocks", "published" to true))
    println(response.title)     // Kotlin Rocks
    println(response.published) // true
}

로그 기록 위임자 패턴

어떤 위임 객체든 로그 기록 기능으로 감싸면 모든 위임된 프로퍼티의 읽기와 쓰기를 투명하게 추적할 수 있습니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class Logged<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(t: Any?, p: KProperty<*>): T {
        println("[READ]  ${p.name} = $v"); return v
    }
    override fun setValue(t: Any?, p: KProperty<*>, value: T) {
        println("[WRITE] ${p.name}: $v -> $value"); v = value
    }
}
var config: String by Logged("default")
fun main() { println(config); config = "production" }

맵과 로그 기록 결합

맵 위임에 로그 기록 래퍼를 추가해 동적 프로퍼티 접근을 완전히 감사 추적할 수 있도록 합니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
class TrackedMap(private val map: MutableMap<String,Any?> = mutableMapOf()) {
    inner class Delegate<T> : ReadWriteProperty<Any?,T> {
        @Suppress("UNCHECKED_CAST")
        override fun getValue(t:Any?,p:KProperty<*>): T {
            val v = map[p.name] as T; println("read ${p.name}=$v"); return v
        }
        override fun setValue(t:Any?,p:KProperty<*>,value:T) {
            println("write ${p.name}=$value"); map[p.name]=value
        }
    }
    var host: String by Delegate()
}
fun main() { val m=TrackedMap(); m.host="localhost"; println(m.host) }

SharedPreferences 스타일 위임자

기반 맵에 값을 저장해 SharedPreferences를 시뮬레이션하는 위임자입니다. 실제 Android 환경에서는 맵을 실제 환경 설정 호출로 교체하면 됩니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val prefs = mutableMapOf<String, Any?>()
fun <T> pref(default: T): ReadWriteProperty<Any?, T> = object : ReadWriteProperty<Any?, T> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t: Any?, p: KProperty<*>): T = prefs.getOrDefault(p.name, default) as T
    override fun setValue(t: Any?, p: KProperty<*>, value: T) { prefs[p.name] = value }
}
object UserPrefs {
    var username: String by pref("Guest")
    var isDarkMode: Boolean by pref(false)
}
fun main() {
    println(UserPrefs.username)   // Guest
    UserPrefs.username = "Alice"
    println(UserPrefs.username)   // Alice
}

타입이 지정된 환경 설정 도우미

각 기본 환경 설정 타입에 대해 타입이 지정된 도우미 함수를 만들어 호출 위치를 더 깔끔하게 구성합니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val store = mutableMapOf<String,Any?>()
fun stringPref(default: String) = object : ReadWriteProperty<Any?,String> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as String
    override fun setValue(t:Any?,p:KProperty<*>,v:String) { store[p.name]=v }
}
fun intPref(default: Int) = object : ReadWriteProperty<Any?,Int> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>) = store.getOrDefault(p.name, default) as Int
    override fun setValue(t:Any?,p:KProperty<*>,v:Int) { store[p.name]=v }
}
object Prefs {
    var name: String by stringPref("default")
    var count: Int by intPref(0)
}
fun main() { Prefs.name="Bob"; Prefs.count=5; println("${Prefs.name}: ${Prefs.count}") }

감사 로그 위임자

모든 프로퍼티 변경을 타임스탬프와 함께 감사 목록에 기록합니다. 규정 준수나 디버깅 시나리오에 적합합니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val audit = mutableListOf<String>()
class AuditDelegate<T>(private var v: T) : ReadWriteProperty<Any?, T> {
    override fun getValue(t:Any?,p:KProperty<*>) = v
    override fun setValue(t:Any?,p:KProperty<*>,value:T) {
        audit += "[${System.currentTimeMillis()}] ${p.name}: $v -> $value"
        v = value
    }
}
var price: Double by AuditDelegate(9.99)
fun main() {
    price = 12.99
    price = 11.49
    audit.forEach(::println)
}

유효성 검사와 맵 저장소

맵 저장소와 유효성 검사를 결합해 잘못된 값을 맵에 쓰기 전에 거부합니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
val data = mutableMapOf<String, Any?>()
fun positiveInt(default: Int): ReadWriteProperty<Any?,Int> = object : ReadWriteProperty<Any?,Int> {
    @Suppress("UNCHECKED_CAST")
    override fun getValue(t:Any?,p:KProperty<*>)=data.getOrDefault(p.name,default) as Int
    override fun setValue(t:Any?,p:KProperty<*>,v:Int){
        require(v>=0){"${p.name} must be >= 0"}
        data[p.name]=v
    }
}
object Inventory { var stock: Int by positiveInt(100) }
fun main(){
    Inventory.stock=50; println(Inventory.stock)
    try { Inventory.stock=-1 } catch(e:Exception){ println(e.message) }
}

위임자 조합 패턴

빌더 방식의 API를 사용해 여러 위임자 동작을 조합합니다. 기본 위임자로 시작한 뒤 로그 기록, 유효성 검사 또는 캐싱을 계층적으로 추가할 수 있습니다.

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
fun <T> ReadWriteProperty<Any?,T>.withLogging(): ReadWriteProperty<Any?,T> {
    val base = this
    return object : ReadWriteProperty<Any?,T> {
        override fun getValue(t:Any?,p:KProperty<*>): T {
            val v = base.getValue(t,p); println("get ${p.name}=$v"); return v
        }
        override fun setValue(t:Any?,p:KProperty<*>,v:T){
            println("set ${p.name}=$v"); base.setValue(t,p,v)
        }
    }
}

실전: 설정 객체 패턴

맵 위임을 사용해 환경 변수나 JSON 설정 파일 같은 외부 원본으로부터 설정 객체를 구성합니다.

class AppConfig(private val raw: Map<String, Any?>) {
    val host: String by raw
    val port: Int by raw
    val debug: Boolean by raw
}
fun main() {
    val env = mapOf("host" to "0.0.0.0", "port" to 8080, "debug" to true)
    val cfg = AppConfig(env)
    println("${cfg.host}:${cfg.port} debug=${cfg.debug}")
}

빠른 확인

프로퍼티를 Map에 위임하면 어떤 일이 일어납니까?

복습

위임자는 강력한 패턴을 가능하게 합니다. 맵 위임으로 동적 데이터와 JSON 데이터를 처리하고, SharedPreferences 스타일로 영속화하며, 규정 준수를 위해 감사 로그를 기록하고, 조합 가능한 유효성 검사를 적용할 수 있습니다. 이 모든 작업을 호출 위치를 변경하지 않고 수행할 수 있습니다.

자주 묻는 질문

“환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임” 강의는 무료인가요?

네 — “환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임”에서 뭘 배우나요?

SharedPreferences, 맵 저장소 및 감사 로깅에 위임을 적용해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. by lazy: 지연 초기화 심층 학습
  2. observable과 vetoable 위임
  3. 사용자 지정 ReadWriteProperty 위임 작성하기
  4. 환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임
← Kotlin Academy(으)로 돌아가기