Sam Story

늦은 초기화 lateinit var , by lazy 본문

Kotlin

늦은 초기화 lateinit var , by lazy

Sam H 2024. 11. 4. 17:42

오늘은 늦은 초기화 lateinit var , by lazy 두가지에 대해서 포스팅 해보겠다.

 

늦은초기화

코틀린에서 늦은 초기화는 변수를 선언할 때 값을 바로 할당하지 않고 나중에 할당하는 것을 말한다.

늦은 초기화를 사용하는 이유는 메모리 효율성코드의 가독성 및 유연성을 높이기 위해서이다.

 

그럼 이런 늦은 초기화는 왜 사용하는가?

 

1. 초기화 시점 제어

모든 변수를 객체 생성 시점에 초기화할 필요는 없기 때문에 필요한 시점에만 초기화하여 프로그램의 성능을 최적화 한다.

예를 들어, View나 네트워크 요청처럼 비용이 큰 초기화 작업은 실제로 필요할 때까지 미뤄두는 것이 효율적이다.

 

2. 메모리 절약

변수를 늦게 초기화 하면 메모리 낭비를 줄일 수 있다.

초기화하지 않아도 되는 변수를 미리 할당하지 않고 필요할 때만 초기화해서 메모리를 사용한다.

 

3. 가독성 및 유지보수성 향상

lateinit과 lazy를 사용하면 초기화 로직을 분리하여 코드의 가독성과 유지보수성을 높일 수 있다.

예를 들어, 클래스의 여러 변수를 생성자에서 전부 초기화하는 것보다,

실제로 해당 변수를 필요로 하는 시점에 명확히 초기화하는 것이 더 직관적일 수 있다.

 

4. Null 안정성 확보

lateinit을 사용하면 nullable 변수를 사용하지 않고도 초기화 지연을 구현할 수 있다.

예를 들어, lateinit을 사용하면 null 검사를 할 필요 없이 변수를 초기화할 수 있어,

null로 인해 발생할 수 있는 오류를 방지할 수 있다.

 

lateinit var

lateinit는 변수를 선언할 때 초기화하지 않고, 나중에 초기화 할 수 있도록 한다.

주로 var 변수에 사용되며, nullable이 아닌 속성에 사용한다.

View 객체를 lateinit으로 선언해, onCreate 메서드 내에서 나중에 초기화하는 경우가 많다.

lateinit var a: String

fun main() {
    a = "lateinit var"
    println(a)
}

 

실행결과

실행결과

 

※ 주의할 점

 

  • lateinit는 기본 자료형(원시타입 : Int, Double 등)에는 사용할 수 없고, 참조 타입에만 사용할 수 있다.
  • 초기화하지 않고 사용하려고 하면 UninitializedPropertyAccessException 예외가 발생한다.
  • var의 속성을 띄고있기 때문에 다른값으로 초기화가 가능하다.

 

by Lazy

 

lazy는 val 변수에 사용하며, 처음 호출될 때 초기화가 이루어지는 지연 초기화 방식이다.

lazy는 주로 값을 처음 사용할 때에만 초기화가 필요하고, 한 번 초기화 후 변경되지 않는 경우에 유용하다.

val a: String by lazy {
    "by lazy"
}

fun main() {
    // 처음 호출될 때 초기화가 이루어짐.
    println(a) // 여기서 초기화가 이루어짐
    println(a) // 이미 초기화된 값을 재사용
}

 

실행결과

실행결과

 

※ 특징

 

  • lazy는 스레드 안전 모드를 지원한다. 여러 스레드에서 안전하게 초기화할 수 있다.
  • 첫 번째 호출 이후에는 값을 캐시하므로 다음 호출 시 초기화된 값을 그대로 사용한다.
  • val 이기 때문에 한번 초기화한 값을 다른 값으로 다시 초기화 할 수 없다.

 

 

늦은 초기화는 필요할 때만 초기화하여 성능을 최적화하고,

코드 가독성을 높이며, null 사용을 줄이는 데 도움이 된다.

네트워크 요청, UI 컴포넌트 초기화 같은 상황에서 이러한 초기화 방식이 특히 유용하다.

 

 

'Kotlin' 카테고리의 다른 글

코루틴 (Coroutine)  (1) 2025.02.05
Kotlin 기본 생성자 오버로딩  (1) 2024.04.20
Kotlin 조건문  (0) 2024.02.02
Kotlin 변수와 자료형  (0) 2024.02.01