[Kotlin] lateinit 변수의 값이 세팅 되었는지 확인하기

Kotlin과 늦은 초기화 전략

kotlin 언어에서는 변수에 null이 들어오지 않았으면 하지만, 값을 초기에 설정할 수 없는 경우를 대비해 두 가지 '늦은 초기화' 방식을 제공한다. 그 중 하나는 lateinit, 그리고 나머지 하나는 lazy이다. 여기서는 lateinit 변수에 값이 세팅 되었는지 확인하는 방법에 대해 다루어보도록 하겠다.

이 변수, 값이 들어오긴 했나?

객체에 속성 값을 담을 때, global 영역에 전역변수를 많이 사용한다. 초기에는 당연히 값이 없기 때문에, lateinit을 사용한 전역변수를 자주 볼 수 있다. 이 변수들은 보통 생성자 코드 블록에서 값이 자동으로 세팅되는 경우가 많지만, 가끔 개발자가 메소드를 통해 직접 값을 주입해주어야 하는 경우가 생길 수 있다. 객체가 생성될 때 강제로 실행되는 생성자 코드 블록과는 다르게, 개발자가 직접 메소드를 통해 값을 주입해야하는 경우에는 해당 변수에 항상 값이 있을 것이라는 보장이 없다.

당연한 소리긴 하지만, 초기화 되지 않은 객체에 접근하려고 하면 예외가 발생하게 된다. 이런 불상사를 막기 위해서는, kotlin에서 제공하는 표준 라이브러리 함수인 isInitialized를 사용하면 된다. 이 함수는 다음과 같이 사용하면 된다.

private lateinit var name: String

fun functionNm() {
    if (::name.isInitialized) {
        println("초기화되어 있음")
    }
}

이 때, 주의할 점으로는 해당 함수를 사용하기 위해서는 값이 아닌 참조를 전달해야 하므로 변수명 앞에 :: 혹은 this::를 적어야 하며, 이런 이유 때문에 전역변수에만 사용할 수 있는 방법이라는 점을 명심해야 한다.


정리하며

Kotlin을 배우면서, 애매한 전역변수들은 어떻게 처리하고 검증하는지 막막 했었는데 인터넷을 찾다보니 나같은 고민을 한 사람이 한둘이 아니라는 것을 알게 되었다. 그래서 나도 마찬가지로 이 글이 누군가에게 도움이 되길 바라며 적어보았다.


참고한 문헌 및 글

How to check if a “lateinit” variable has been initialized?
I wonder if there is a way to check if a lateinit variable has been initialized. For example: class Foo() { private lateinit var myFile: File fun bar(path: String?) { path?.let {