728x90

코틀린은 클래스를 설계할 때 안정성을 위해 반드시 변수의 값을 초기화할것을 권장함

 

초기화 지연 ?

변수를 선언할 때 값을 지정하지 않고, 나중에 지정할 수 있는 방법이다. 

 

목적 -> 메모리를 효율적으로 사용하기 위해서, null safe 한 value를 사용하기 위해서 

 

lateinit , var

  • 변수 타입을 지정해줘야함 
  • 원시타입(primitive type)은 사용할 수 없음 (Int, Long, Double, Boolean, Char, Short, Byte, Float)
  • 선언 후, 나중에 초기화 해줘도 됨
class Test{
    lateinit var text : String    //primitive 타입 사용불가 
    fun lateInit (){
            if(::text.isInitialized){ // :: 으로 참조 
                println("초기화 됨")
            }else{
                println("초기화 전")
            }
    }
}
fun main() {
    val test = Test()
    test.lateInit()                     //초기화 전
    test.text = "초기화 시점"  
    test.lateInit()                    // 초기화 됨
    println("text = ${test.text}")  //text = 초기화 시점 
}

 

lazy , val

  • val(상수) 이기 때문에 값을 다시 변경할 수 없다. 
  • 호출 시점에 by lazy {...} 에 정의해둔 블록 부분의 초기화를 진행한다. 
  • 클래스 생성자에서 사용불가 
  • 원시 타입(primitive type) 사용 가능 
  • 지역 변수에서도 사용 가능 
class ByLazy{
    init {
        println("init Block") // 최초 초기화 선언알림
    }
    val lazy : String by lazy { "Lazy Test" }
    fun flow(){
        println("초기화 진행 전")             //초기화 되기 전 
        println("$lazy : 최초 초기화")       //최초 초기화 시점
        println("$lazy : 최초 초기화 후")     //초기화된 값 사용(불변)
    }
}
fun main(){
    val lazyInstance = ByLazy()  //init Block 
    lazyInstance.flow() /*
                             init Block 
                             초기화 진행 전
                             Lazy Test : 최초 초기화
                             Lazy Test : 최초 초기화 후                
                        */
}

 

lazy 는 선언과 동시에 초기화를 해줘야 하고, 호출시점에 초기화가 이루어진다.

  Primitive Type null-able local variable
lateinit X X X
lazy O O O

+ Recent posts