[Kotlin] lateinit vs lazy

eunji·2023년 9월 19일
0

Kotlin

목록 보기
1/1

늦은 초기화 기법 with Kotlin

늦은 초기화는 객체 초기화를 나중에 하는 것이다.

예를 들어 변수 a를 사용할 예정이지만, a의 첫 상태를 정의하기 어려울 때 사용된다.
a를 null로 초기화하는 방법도 있지만 kotlin에서는 null 사용을 지양한다.

따라서, 늦은 초기화 기법을 위해 대표적으로 두 방법을 사용하고 있다.

lateinit

lateinit var x: String
x = "kotlin"

// kotlin
println(x)

lateinit을 사용하여 var 형태의 변수 x가 나중에 사용될 것이며, String 타입이라는 것만 정해준다.
이후에 사용할 때 변수 x를 초기화하면 값이 들어간다. ("kotlin" 이라는 값으로 초기화했다)

var 타입으로 변수 x를 선언했는데, lateinit을 사용하면 늦은 초기화 이후에도 값을 계속하여 변경할 수 있다.

변수 x에 값이 들어가기 전에는 null이 아니라 uninitialized(초기화되지 않음) 상태로 존재하기 때문에 null로 초기화 시 에러가 발생한다.
따라서, lateinit으로 변수를 선언했다면 사용 전에 꼭 초기화 단계를 거쳐야 한다.

lateinit의 경우에는 계속하여 값이 변경될 수 있기 때문에 var 형태를 사용해야 하며, Primitive Type(Int, Float, Double, Long 등) 에는 사용할 수 없다.


lazy

val x: String by lazy { "kotlin" }

val 형태의 x가 나중에 사용될 것이며, 사용 시에 어떤 값이 들어가는지 정의한다.

by lazy는 선언 당시에는 초기화를 할 방도가 없지만, 이후에 의존하는 값들이 초기화 된 이후에 정의하고 싶을 때 사용한다. 즉, 호출 시에 어떻게 초기화할지 정의할 수 있는 구문이다.

lateinit var a : String
val x : Int by lazy { a.length }
a = "kotlin"
println(x)

이 코드에서는 x는 a라는 문자열의 길이를 받아와야 하지만, a는 lateinit으로 설정되어 있기 때문에 아직 그 길이를 알 수 없다.

무조건 a가 제대로 된 값을 가지게 된 후에 x를 호출할 예정이라면, by lazy를 활용할 수 있다.
x는 처음으로 사용되는 순간인 4번째 줄에서 a.length으로 초기화된다.

변수 x는 lateinit를 사용했을 때와는 다르게 val 형태로 선언되어 있다.
이는 단 한 번의 늦은 초기화가 이루어지고 이후에는 값을 변경할 수 없음을 보장한다.


마무리 lateinit vs lazy

  • lateinit -> var 형태로 선언되므로 값 변경 가능
    - 초기화 이후에도 값이 변경될 가능성이 있으면 사용!
  • lazy -> val 형태로 선언되므로 값 변경 불가
    - 첫 초기화 이후로 읽기 전용으로 사용될 것이면 사용!
profile
tech blog

0개의 댓글