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 |