오늘은 kotlin에서 늦은 초기화 기법(지연초기화)에 대해 공부해보았다.
예를 들어서 변수 a를 사용할 예정인데, 당장은 넣을 값이 없을때? 우리는 null값을 넣을 수 있다.
var a:String? = null
하지만 코틀린은 null사용을 지양한다. 이때 늦은 초기화를 사용해줄 수 있다.
lateinit은 어떤 동작의 결과값을 기반으로 변수를 지연초기화 해준다. 그후, 해당 값을 또 바꿀수 있다. 이는 var로 초기화를 해주기 때문에 늦은초기화 이후에도 값이 계속해서 바뀔 수 있는것이다.
fun main() {
lateinit var text: String
val a = 1
text = "a : $a1"
println(text)
val b = 2
text = "Result : ${a + b}"
println(text)
}
이렇게 사용해 줄 수 있다. 하지만 만약 lateinit을 사용하고, 늦은초기화조차 하지 않는다면 아래와 같은 에러를 볼 수 있다.
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property text has not been initialized
이렇게 컴파일단계에서 오류가 발생하기때문에 잠재적인 오류를 방지해주기도 한다.
lateinit var etName:TextView = findViewById(R.id.et_name)
android studio에서는 xml에서 et_name이라는 id를가진 값을 지연초기화 해줄때, 이런식으로 사용할 수 있다.
lateinit은 속성을 무조건 var을 사용해야하며, Int, Float, Double, Long에는 사용할 수 없다.
by lazy는 선언 당시에는 초기화를 할 방도가 없지만, 이후에 의존하는 값들이 초기화된 이후에 값을 채워넣고 싶을때 사용해준다.
이는 호출시 이를 어떻게 초기화해줄지에 대해 정의할수 있는 구문이다.
fun main() {
lateinit var text: String
val textLength: Int by lazy {
text.length
}
text = "asdf1234"
println(textLength)
}
이런식으로 사용해줄 수 있다.
private val etName: EditText by lazy {findViewById(R.id.et_name)}
android studio에서는 xml에서 et_name이라는 id를 가진 값을 지연초기화 해줄때, 이런식으로 사용해줄 수 있다.
by lazy는 무조건 val을 사용해야한다.
둘다 지연초기화를 위해서 사용된다는 목적을 가지고 있다.
하지만
lateinit은 var를 사용하며 값을 중간에 변경할 수 있고,
by lazy는 val을 사용하며 값을 중간에 변경할 수 없다.