References: Do it! 코틀린 프로그래밍

코틀린에서 lateinit을 이용한 지연 초기화에 대해 알아봅니다.

 

 

1. 지연 초기화

 

프로퍼티를 선언하면 기본적으로 모두 초기화를 해야 합니다.

만약 객체 정보가 나중에 나타나는 경우 객체 생성과 동시에 초기화가 힘들 수 있습니다.

이럴 경우에 지연 초기화를 사용합니다.

 

 

2. lateinit

 

lateinit키워드를 사용하면 프로퍼티에 값이 바로 할당되지 않아도 컴파일러에서 이를 허용합니다.

단 lateinit은 다음과 같은 제약사항이 있습니다.

 

  • var로 선언된 프로퍼티에만 사용할 수 있다.
  • 프로퍼티에 대한 게터와 세터를 사용할 수 없다.

다음 예시를 통해 확인해 보도록 하겠습니다.

 

class Person{
    lateinit var name: String
    fun test(){
        if(!::name.isInitialized){ println("Not initialized.") }
        else {{ println("Initialized.") }
    }
}
fun main() {
    var person = Person()
    person.test()
    person.name = "smoh"
    person.test()
}

 

  • lateinit var name: String: 지연된 초기화를 허용합니다.
  • ::name: 프로퍼티 참조를 위해 콜론을 두 개 사용함.
  • .isInitialized: 프로퍼티가 초기화되었는지 확인하는 코틀린 표준 함수 API

위의 코드를 실행하면 결과는 다음과 같습니다.

만약 초기화 없이 사용하면 어떻게 될까요?

코드를 다음과 같이 수정한 후 실행시켜 봅시다.

 

...
fun main() {
    var person = Person()
    println("Name: ${person.name})
}

 

위와 같이 lateinit 프로퍼티인 name이 초기화되지 않았다는 에러가 발생합니다.

 

 

이번에는 생성자를 통해 객체를 지연된 초기화하는 법을 알아보겠습니다.

 

data class Person(var name: String, var age: Int)
lateinit var person: Person
fun main() {
    person = Person("smoh", 28)
    println(person.name + " is "+ person.age.toString())
}

 

  • lateinit : 객체를 지연 초기화하도록 함.
  • person = Person("smoh", 28) : 생성자 호출 시점에서 객체가 초기화됨.

main함수 밖의 person객체는 생성자를 통해 선언되지 않았지만 lateinit에 의해 지연 초기화가 허용됩니다.

 

 

 

반응형

+ Recent posts