지연초기화
- 코틀린은 클래스를 설계할 때 안정성을 위해 변수의 값을 초기화 할 것을 권장한다.
- 클래스를 설계할 때 초기값 정의가 난처해 나중에 대입하기 위한 문법이다.
- 지연 초기화 또는 늦은 초기화를 위해
lateinit
과 lazy
키워드를 사용한다.
- 저사양으로 제한 되어 있는 환경에서는 메모리를 더욱 효율적으로 사용할 수 있다.
변수의 지연 초기화
lateinit
lateinit
은 Int, Long, Double, Float와 같은 Primitive Type에 대해서는 사용할 수 없다.
fun main() {
var student = Student()
student.name = "kim"
student.displayInfo()
student.age = 20
student.displayInfo()
}
class Student {
lateinit var name:String
var age:Int = 0
fun displayInfo() {
println("이름은 ${name} 입니다.")
println("나이는 ${age} 입니다.")
}
}
isInitialized
- 변수를 사용하기 전에 초기화 되었는지 확인해야 안정성을 높일 수 있다.
isInitialized
를 사용하여 값이 초기화 되었는지 확인할 수 있으며 true/false 값을 반환한다.
- 사용할 때는 값이 아니라 참조 형태로 사용해야 하기 때문에
this::
또는 ::
를 붙인다.
fun main() {
var student = Student()
student.displayInfo()
student.name = "kim"
student.age = 20
student.displayInfo()
}
class Student {
lateinit var name:String
var age:Int = 0
fun displayInfo() {
if (this::name.isInitialized) {
println("이름은 ${name} 입니다.")
println("나이는 ${age} 입니다.")
} else {
println("name 변수를 초기화해 주세요.")
}
}
}
상수의 지연 초기화
lazy
- lazy의 lamda 구문은 변수를 처음 사용할 때 한 번만 호출되며 마지막 값이 초기 값으로 할당 된다. address 상수의
by lazy {}
에 정의한 println("address 초기화")
구문이 한 번만 실행 되었음을 확인할 수 있다.
fun main() {
var student = Student()
student.name = "kim"
student.displayInfo()
student.age = 20
student.displayInfo()
}
class Student {
lateinit var name:String
var age:Int = 0
val address: String by lazy {
println("address 초기화")
"seoul"
}
fun displayInfo() {
println("이름은 ${name} 입니다.")
println("나이는 ${age} 입니다.")
println("주소는 ${address} 입니다.")
}
}