프로그래밍 언어/코틀린

lateinit과 by lazy의 차이

닉네임못짓는사람 2021. 12. 28. 20:08
반응형

코틀린에서는 기본적으로 변수에 null이 들어가는 것을 허용하지 않는다. (nullsafe)

때문에 아래처럼 class에서 전역 변수를 선언하고 이후에 초기화하기 위해선

해당 변수를 nullable한 변수로 선언해줘야 한다.

class exam(){
    var a: String? = null
    fun hello(){
		a = "Hello"
        println(a)
    }
}

 

하지만, 위와 같은 방법은 다음과 같은 이유로 쓰는 것이 꺼려질 수 있다.

 

1. 변수 a가 nullable하기 때문에 null이 들어가면 안 되는 변수에 사용하기가 꺼려진다.

   (Kotlin의 null safety장점 활용 불가)

2. 해당 변수의 값이 초기화 이후 변하지 않을 경우 a를 var로 선언할 필요가 없어진다.

 

위와 같은 경우에 사용하기 위해 코틀린에서는 초기화를 늦출 수 있는 두 가지 방법을 추가로 제공한다.

lateinit


lateinit의 경우 이름만 들어도 초기화를 늦추기 위한 방법이라는것이 느껴진다.

lateinit은 var에 사용되며, nullable변수와 가장 큰 차이점은 lateinit을 사용할 경우

해당 변수는 여전히 nullsafe하다는 점일 것이다.

class exam(){
    lateinit var a: String
    fun hello(){
        a = "Hello"
        println(a)
    }
}

lateinit은 nullsafe하기 때문에 초기화 전에는 null이 아닌 uninitialized상태로 존재한다.

초기화를 하지 않고 변수를 사용하려고 하면 초기화되지 않았다는 오류가 발생한다.

 

주의할 점은 lateinit은 Int, Long, Float, Double등 Primitive Type에는 사용할 수가 없다는 점이다.

 

by lazy


또 다른 방법으로는 by lazy를 사용할 수 있다.

위에서 lateinit은 var에 사용했던 것에 반해 by lazy는 val변수에 사용한다.

그리고 lateinit과 같이 by lazy도 여전히 nullsafe하다는 부분은 동일하다.

class exam(){
    lateinit var a: String
    lateinit var b: String
    val c: String by lazy{a + b}
    fun hello(){
        a = "Hello"
        b = " World"
        println(c)
    }
}

by lazy는 위와 같이 사용할 수 있으며, 경우에 따라 다른 값으로 변수가 초기화되지만

한 번 초기화되면 이후로는 값이 바뀌지 않는 경우에 by lazy를 사용할 수 있다.

 

또한 by lazy의 경우 코드를 보면 값 지정 자체는 변수 선언과 동시에 해주어야 한다.

하지만 실질적으로 값이 정해지는 것은 a와 b값이 정해진 뒤이기 때문에 늦은 초기화로 사용된다.

lateinit VS by lazy


lateinit과 by lazy는 코틀린에서 늦은 초기화를 위해 사용할 수 있는 방법들이다.

둘의 큰 차이점이라고 하면 lateinit은 var, by lazy는 val에 사용한다는 점인데,

때문에 lateinit의 경우 늦은 초기화를 하지만 이후에 값이 계속 바뀔 수 있는 변수에 사용하고

by lazy의 경우 위에서 말했듯이 초기화 이후에는 값의 변동 없이 사용하는 변수에 사용할 수 있다.

반응형