말그대로 늦은 초기화 입니다.
다들 그런 상황이 생길겁니다.
초기값으로 null을 지정하고 (혹은 초기화를 안해준 변수 선언)
추후에 우리가 원하는 값으로 초기화 해주고 싶다!!!
근데??? 하지만 코틀린에서는 최~~대한 null을 사용을 자제해야합니다.
그래서 lateinit
이 있다!!
fun main() {
lateinit var text : String
val result = 30
text = "Result : $result"
println(text)
val number = 50
text = "Result : ${result + number}"
println(text)
}
- 결과 -
Result : 30
Result : 80
보면 그냥 var
변수를 쓰는 것처럼 사용하지만
처음에 변수를 초기화 안해도 나중에 초기화를 할 수 있습니다.
그리고 나중에 초기화를 한다는 특성때문에 무조건 var
를 사용해야 합니다.
또 lateinit
을 해줬는데 끝까지 초기화를 안하게 되면
컴파일 단계에서 오류가 발생하여 실수를 방지해주기도 합니다.
fun main() {
lateinit var text: String
val textLength: Int by lazy {
text.length
}
// 늦은 초기화!
text = "Hello World!"
println(textLength)
}
- 결과 -
12
lazy는 by lazy
로 사용할 수 있는데
초기화 당시에 초기화 못해주는 상황이지만
추후에 lazy scope 안에서 초기화 된 값을 지정해줍니다.
textLength
을 호출시 이를 어떻게 초기화 해줄지 대하여 정의하는 키워드 입니다.
그리고 val
을 사용하여 선언을 할 수 있습니다!!
val 사용 가능
lateinit
: 사용 불가능lazy
: 사용 가능용도
lateinit
: 초기화 이후에 계속하여 값이 바뀔 수 있을 때 (초기화만 늦게 이뤄지는 변수)lazy
: 초기화 이후에 읽기 전용 값으로 사용할 때 (초기화가 늦게 이뤄지는 고정 값)생각외로 늦게 초기화 되는 변수들이 좀 있어서
ex)스프링 @Autowired
같은거
자주 쓸것 같습니다.