서론
변수를 정의할 때 자주 쓰이는 lateinit와 lazy는 모두 늦은 초기화 기법이다. 오늘은 이 둘의 차이점에 대해 정리해보려 한다.
늦은 초기화란?
늦은 초기화란, 말 그대로 객체를 늦게 초기화하는 것을 말한다.
String java; //java 선언
var kotlin: String // kotlin 선언
java가 익숙한 사람에게 위 코드는 별 문제가 없어 보이지만, 초기화 없이 선언하면 변수에 기본으로 값이 들어갔던 java와는 다르게 Kotlin에서는 초기화가 필수이기 때문에 위 선언 코드에서 에러가 발생한다.
var kotlin: String? = null
따라서 nullable 타입으로 만들고 null로 초기화하면 코드는 정상적으로 동작할 것이다.
하지만, null 사용을 주의하자는 Kotlin 언어의 특성을 무시하는 것이다.
이때 늦은 초기화를 사용하여 해결할 수 있다. 변수 선언부에서 초기화를 해주지 않고, 나중에 값을 넣어주겠다는 의미이다. 늦은 초기화를 사용하면 null로 초기화해주지 않아도 된다.
lateinit
lateinit var str: String
str = "lateinit 예시"
lateinit를 사용하면 변수의 값을 지정하는 작업을 나중에 할 수 있다. Nullable 하지 않은 변수를 선언하면서 초기화하는 작업을 뒤로 미루고 싶을 때 lateinit 키워드를 사용한다.
lateinit는 mutable 변수만 사용할 수 있기 때문에 var 키워드를 사용해야 한다.
또한, Primitive Type(Int, Float, Double, Long 등..)에는 사용할 수 없으니 주의하자 ❗
by lazy
by lazy도 lateinit와 유사하게 늦은 초기화 기법인데, 초기화하는 시점이 변수를 호출하는 시점이다.
lateinit var a: String
val str: String by lazy {
"늦은 초기화 기법 : $a"
}
a = "lazy"
println(str)
위 코드에서 str 변수가 초기화될 때 a에 해당하는 값을 모르는 상황이다.
하지만, 위 코드는 문제없이 동작한다. 이유는 by lazy 사용으로 인해 실제 str 변수가 초기화되는 시점이 println(str) 즉, 변수가 최초로 사용되는 시점에 초기화가 진행된다.
by lazy의 경우 immutable 변수에만 적용이 가능하기 때문에 val 키워드 변수에만 적용이 가능하다.
정리
lateinit | by lazy | |
초기화 횟수 | 제한 없음 | 최초 한번만 |
초기화 시점 | 제한 없음 | 변수 호출(선언) 시점 |
키워드 | var | val |
Primitive Type 사용 여부 | X | O |
nullable | X | O |
Reference
lateinit과 by lazy의 차이가 무엇인가요?
1. 요약 2. 늦은 초기화란? 3. lateinit 4. by lazy 5. 정리 6. 추가로 나올 수 있는 질문 6-1. lateinit을 초기화하기 전 까지는 변수에 무슨 값이 들어있을까요? 6-2. 초기화를 하지 않고 실행하면 어떻게 될
todaycode.tistory.com
Properties | Kotlin
kotlinlang.org