Kotlin 지연 초기화
Kotlin 지연 초기화
Kotlin은 변수를 선언할 때 값을 무조건 설정해야 하는데, 이를 지연시키는 것을 지연 초기화라고 한다.
변수 초기화
var v1
Kotlin: This variable must either have a type annotation or be initialized
코틀린은 변수를 초기화 하지 않고 그냥 선언만 하게 될 경우, 해당 변수에 어떤 타입이 들어올지 예상하지 못하므로, 타입을 기재를 해주던지, 초기화를 수행해주어야 한다.
var v1:Int
or
var v1 = 100
으로 사용해주어야 한다.
Property 초기화
main 함수 내에서는 타입만 지정해도 되지만, 클래스 내부에서는 변수가 Property 로 자동 지정이 되므로, 추상화또는 초기화를 해주어야 한다.
fun main() {
var a1:Int // No Error
val obj = TestCalss1()
}
class TestCalss1{
var a1:Int // Error / Kotlin: Property must be initialized or be abstract
}
Kotlin: Property must be initialized or be abstract
Class Init
init 메서드를 통해서 변수 초기화를 할 수 있다. 그러나, 변수 선언시 타입은 명시 해주어야 한다.
fun main() {
val obj1 = TestCalss1()
println("obj1.a1 : ${obj1.a1}")
}
class TestCalss1{
var a1 = 100 // 타입 생략이 가능하다.
var a2 // 타입 생략이 불가능 하다. 타입을 추론하지 못하기 때문에
init {
a2 = 100
}
}
lateinit
var 로 선언된 변수의 초기화를 뒤로 미룰 수 있다.
변수의 값을 사용하기 전에 반드시 초기화가 이루어져야 한다.
val 로 선언된 변수는 오류가 발생한다. val 로 선언된 변수는 setter 메서드가 추가되지 않기때문에 불가능하다.
fun main() {
val obj1 = TestCalss1()
println("obj1.a1 : ${obj1.a1}")
obj1.a3 // lateinit property a3 has not been initialized
obj1.testMehod1()
}
class TestCalss1{
var a1 = 100
var a2:Int
lateinit var a3:String
init {
a2 = 100
}
fun testMehod1(){
if(::a3.isInitialized == false) {
a3 = "문자열"
}
println("a3 : $a3")
}
}
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property a3 has not been initialized
a3 변수는 lateinit 으로 선언이 되었더라도, 초기화 되지 않았기 때문에 사용이 불가능하다.
lazy
val 로 선언된 변수는 lateinit 으로 지연 초기화하는 것이 불가능핟.
val 로 선언된 변수는 lazy 코드 블록을 이용하면 되는데, 이는 나중에 프로퍼티의 값을 세팅해준다는 의미가 아닌 사용할 때 값을 초기화 한다는 의미를 가지고 있다.
class TestCalss1{
val a1:String by lazy{
println("a4 init")
"문자열2"
}
}
Kotlin: Property delegate must have a 'getValue(TestCalss1, KProperty<*>)' method. None of the following functions is suitable:
public inline operator fun <T> Lazy<Unit>.getValue(thisRef: Any?, property: KProperty<*>): Unit defined in kotlin
val 로 선언된 변수는 lazy 를 이용해서 class 생성 시 초기화하지 않고, 변수 사용시에 초기화 하도록 할 수 있다. lazy 코드 블록 안에서 값을 설정해주지 않을 경우, 위와 같은 delegate 오류가 발생한다.
댓글
댓글 쓰기