코틀린 lateinit vs lazy 차이 정리
코틀린(Kotlin) 프로그래밍 언어는 다양한 기능을 제공하는데, 그 중 특히 유용한 두 가지 기능이 바로 lateinit
과 lazy
입니다. 이 두 기능은 초기화 지연(Delayed Initialization)을 제공하지만, 각각의 특성과 사용법이 다르므로 상황에 맞게 접근하는 것이 중요합니다.

lateinit과 lazy의 정의
lateinit
은 변수를 나중에 초기화하겠다는 의도를 명시적으로 전달하는 키워드입니다. 주로 가변 변수(var
)와 함께 사용되며, 초기화 시점을 유연하게 조정할 수 있도록 도와줍니다. 반면, lazy
는 변수를 처음 사용할 때 초기화하는 방식으로, 주로 불변 변수(val
)에 사용됩니다.
이 두 가지 기능은 초기화를 지연시킨다는 공통점이 있지만, 다루는 방식과 조건이 다릅니다. 이제 각 기능의 특징을 자세히 살펴보겠습니다.
1. lateinit의 특징
코틀린에서 lateinit
의 주요 목적은 사용자가 나중에 초기화를 할 것임을 명시하는 것입니다. lateinit
을 사용할 때 알아야 할 몇 가지 조건이 있습니다:
- 변수는 반드시
var
로 선언해야 합니다. - 기본형(Primitive Type), 즉
Int
,Double
,Boolean
등에는 사용할 수 없습니다. - 초기화되지 않은 상태에서 해당 변수를 접근하면
UninitializedPropertyAccessException
오류가 발생합니다.
다음은 lateinit
을 사용한 예제입니다:
class Example {
lateinit var name: String
fun initializeName() {
name = "Kotlin"
}
fun printName() {
if (::name.isInitialized) {
println(name)
} else {
println("Name is not initialized")
}
}
}
위 예시에서 name
변수는 lateinit
키워드를 사용하여 선언되었고, initializeName
메서드에서 나중에 초기화됩니다. printName
메서드는 변수가 초기화되었는지를 확인하기 위해 isInitialized
를 활용합니다.
2. lazy의 특징
이제 lazy
에 대해 살펴보겠습니다. lazy
는 변수를 처음 사용할 때 필요한 초기화 작업을 수행하여 메모리 효율성을 극대화합니다. lazy
의 주요 특징은 다음과 같습니다:
val
로 선언된 변수에만 사용할 수 있습니다.- 변수를 처음 호출할 때, 초기화 코드는 한 번만 실행됩니다.
- 스레드 안전(Thread-Safe)하게 초기화되어, 여러 스레드에서 동시에 접근해도 안전합니다.
아래는 lazy
를 활용한 예시입니다:
class Example {
val name: String by lazy {
println("Initializing name")
"Kotlin"
}
}
이 코드는 name
변수가 처음 사용될 때 초기화 블록이 실행되며, 이후에는 결과 값이 캐시되어 재사용됩니다.

3. 두 기능의 차이점 정리
이제 lateinit
과 lazy
의 차이를 정리해 보겠습니다. 이 두 기능의 차이점은 다음과 같습니다:
lateinit
은var
변수에 적용하기 때문에 값이 나중에 변경될 수 있는 반면,lazy
는val
변수에만 사용되어 한 번 초기화되면 변경할 수 없습니다.lateinit
은 초기화 이전에 접근하면 예외가 발생하지만,lazy
는 변수가 처음 호출될 때만 초기화가 진행됩니다.lateinit
은 사용자가 직접 초기화해야 하지만,lazy
는 완전히 자동으로 진행되며, 호출 시점에 초기화가 이루어집니다.
결론
코틀린에서 제공하는 lateinit
과 lazy
는 각각 독특한 목적과 동작 방식을 지닙니다. lateinit
은 나중에 초기화해야 할 필요가 있는 가변 변수에 적합하며, lazy
는 불변 변수의 초기화를 지연시키기 위해 사용됩니다. 각 기능의 활용에 따라 코드의 가독성과 성능을 최적화할 수 있습니다. 따라서 개발자는 상황에 맞게 두 기능을 적절히 선택하여 사용해야 합니다.
자주 물으시는 질문
lateinit란 무엇인가요?
lateinit는 코틀린에서 나중에 변수 초기화를 명확하게 지시하는 키워드입니다. 주로 가변 변수에 사용되며, 초기화 시점을 유연하게 조정할 수 있습니다.
lateinit을 사용할 때 주의해야 할 점은 무엇인가요?
lateinit 변수는 반드시 var로 선언해야 하며, 기본형 타입에는 사용할 수 없습니다. 초기화되지 않은 상태에서 접근할 경우 예외가 발생할 수 있습니다.
lateinit 변수의 초기화 상태를 확인하는 방법은?
변수가 초기화되었는지를 확인하려면 ::변수이름.isInitialized
를 사용합니다. 이를 통해 초기화 여부를 안전하게 체크할 수 있습니다.
lateinit과 lazy의 차이점은 무엇인가요?
lateinit은 var로 선언된 가변 변수에 사용되며, 나중에 직접 초기화해야 합니다. 반면 lazy는 val로 선언된 불변 변수에만 적용되며, 처음 사용할 때 자동으로 초기화됩니다.