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 오류가 발생한다.


댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super