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에 의해 지연 초기화가 허용됩니다.
반응형
'Programming' 카테고리의 다른 글
[Kotlin] 28. 위임(Delegation) (0) | 2019.09.01 |
---|---|
[Kotlin] 27. 지연 초기화: lazy (0) | 2019.08.27 |
[Kotlin] 25. Custom Getter & Setter (0) | 2019.08.27 |
[Kotlin] 24. 클래스 혹은 객체간의 관계 (0) | 2019.08.27 |
[Kotlin] 23. 다형성(Polymorphism) (0) | 2019.08.24 |