Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[14일차 Kotlin] 지연 초기화 - lateinit과 lazy 본문

Computer/Kotlin

[14일차 Kotlin] 지연 초기화 - lateinit과 lazy

Wise-99 2023. 5. 17. 18:52

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 지연 초기화란?

  • Kotlin은 프로퍼티를 선언할 때 값을 무조건 설정해야 하는데 이를 지연 시키는 것을 지연 초기화라고 한다.

lateinit

  • var 로 선언된 변수의 초기화를 뒤로 미룰 수 있다.
  • 변수의 값을 사용하기 전에 반드시 초기화가 이루어져야 한다.
  • val 로 선언된 변수는 오류가 발생한다.
  • lateinit은 기본 자료형(Int, Double 등)에서는 사용할 수 없다.

lazy

  • val로 선언된 변수는 setter()가 생성되지 않기 때문에 lateinit으로 지연 초기화 하는 것이 불가능하다.
  • val로 선언된 변수는 lazy 코드 블록을 이용하면 되는데 이는 나중에 프로퍼티의 값을 셋팅해준다는 의미가 아닌 사용할 때 값을 초기화 한다는 의미를 가지고 있다.
  • lazy 코드 블록의 제일 마지막에 작성한 값이나 변수의 값, 수식의 값을 프로퍼티에 저장한다.

 

📖 예제 코드

fun main(){
    val t1 = TestClass1()
    t1.testMethod1()
    
    println("---------------------------------------")
    
    t1.a4 = "문자열 입니다."
    t1.testMethod1()
}

class TestClass1{
    var a1:Int = 100
    var a2 = 200
    var a3:Int

    // lateinit
    lateinit var a4:String

    // lazy
    val a5:Int by lazy {
        val temp = 1 + 2 + 3 + 4 + 5
        temp
    }

    init{
        a3 = 300
    }

    fun testMethod1(){
        println("a1 : $a1")
        println("a2 : $a2")
        println("a3 : $a3")

        if(::a4.isInitialized){
            println("a4 : $a4")
        }
        
        println("a5 : $a5")
    }
}

✔️ 코드 해석

  • a3은 var 프로퍼티이므로 init 블록에서 값을 저장하였다. 
    • init 블록에서 프로퍼티에 값을 저장한다면 프로퍼티를 정의할 때 값을 저장하지 않아도 된다.
  • a4는 val 프로퍼티이므로 lateinit을 사용하여 지연 초기화하였다.
    • testMethod1()에서 ::을 사용하여 a4에 대한 속성을 참조한다.
    • a4가 초기화가 되어있을 때만 a4의 값을 출력한다.
    • 따라서 값을 저장하지 않으면 a4는 출력되지 않는다.
  • a5는 lazy를 이용하여 지연 초기화하였다.
    • lazy 블럭 내에서 temp가 가장 마지막에 작성되어있기 때문에 temp(1+2+3+4+5) 값이 저장되고 출력된다.

 

✔️Console 출력 결과