2023.12.18(월) TIL

quinones·2023년 12월 18일

오늘은 kotlin에서 늦은 초기화 기법(지연초기화)에 대해 공부해보았다.
예를 들어서 변수 a를 사용할 예정인데, 당장은 넣을 값이 없을때? 우리는 null값을 넣을 수 있다.

var a:String? = null

하지만 코틀린은 null사용을 지양한다. 이때 늦은 초기화를 사용해줄 수 있다.

lateinit

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

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을 사용하며 값을 중간에 변경할 수 없다.

profile
이우진

0개의 댓글