DI(의존성 주입)나 외부에서 초기화를 하기 위해서 만든 기능이다
초기화 전에 변수에 있는 값에 접근하려고 시도하더라도
컴파일 타임에 에러가 발생하지 않는다
선언 시 주의점
- val로 선언불가
- 변수 선언 이후 값 초기화가 가능해야 하므로
- Nullable 허용 안 됨
- '?.' 연산자 허용 안 됨
- Null 값을 가진 변수에 접근하려는 코드를 짜도 컴파일 타임에 에러가 발생하지 않음. 런타임에 에러발생
예제코드)
class LateInit{
lateinit var text : String
fun printText(){
//Null값을 가진 text 변수에 접근시도
println(text)
text = "안녕하세요"
}
}
fun main(){
val test = LateInit()
test.printText()
}
에러메세지)
변수가 초기화 되지 않았다는 에러 메세지가 출력된다
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property text has not been initialized
at LateInit.getText(lateInit.kt:2)
at LateInit.printText(lateInit.kt:8)
at LateInitKt.main(lateInit.kt:16)
at LateInitKt.main(lateInit.kt)
lateinit 사용 시, 해당 변수가 초기화 되었는지 확인하려면
아래와 같이 lateinit으로 선언된 변수의 isInitialized 속성을 이용하면 된다
*주의! 해당 변수가 선언된 클래스 내부에서만 사용가능
class LateInit{
lateinit var text : String
fun printText(){
//초기화 되었는지 확인
if(this::text.isInitialized) {
println(text)
}
text = "안녕하세요"
}
}
fun main(){
val test = LateInit()
test.printText()
}
만약, 해당 클래스 밖에서도 isInitialied 속성을 사용하고 싶다면
클래스 내부에 isInitialied 속성을 별도로 선언하여 사용가능
class LateInit{
lateinit var text : String
//text 변수에 대한 isInitialized 속성
val textInitialized : Boolean
get() = this::text.isInitialized //text 변수의 isInitialized 속성 값 반환하는 Getter
fun printText(){
println(text)
text = "안녕하세요"
}
}
fun main(){
val test = LateInit()
//text 변수의 초기화 여부 확인
if(test.textInitialized) {
test.printText()
}
}
'Programming Language > Kotlin' 카테고리의 다른 글
Lazy Init - Synchronization 옵션 (0) | 2023.10.30 |
---|---|
Lazy Init - 기본 (0) | 2023.10.28 |
변성 (0) | 2023.10.21 |
댓글