환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- by lazy: 지연 초기화 심층 학습
- observable과 vetoable 위임
- 사용자 지정 ReadWriteProperty 위임 작성하기
- 환경 설정, 맵 기반 프로퍼티 및 로깅을 위한 위임