본문 바로가기
Programming Language/Kotlin

Late Init

by YellowCow 2023. 10. 31.

 

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

댓글