[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법
9. 지연 초기화
lateinit
- 변수만 미리 선언하고 초기화를 나중에 해야할 경우 사용
- Nullable로 선언하는 경우
-> 해당 변수의 메서드/프로퍼티에 접근할 때 Safe call 사용해야
-> 가독성 떨어짐
class Person {
var name: String? = null
init {
name = "Lionel"
}
fun process() {
name?.plus(" Messi")
print("이름의 길이 = ${name?.length}")
print("이름의 첫 글자 = ${name?.substring(0, 1)}")
}
}
- lateinit 키워드를 사용하는 경우
-> Safe call 쓰지 않아도 됨
-> 가독성 좋아짐
class Person {
lateinit var name: String
init {
name = "Lionel"
}
fun process(){
name.plus(" Messi")
print("이름의 길이 = ${name.length}")
print("이름의 첫 글자 = ${name.substring(0, 1)}")
}
}
- lateinit 특징
- var로 선언된 클래스 프로퍼티에만 사용 가능
- null 허용 X
- 기본 자료형(Int, Long, Double, Float 등) 사용 X
- lateinit 키워드 사용 후 초기화하지 않고 사용하는 경우
-> null 예외 발생!
lazy
- 읽기 전용 변수 val을 지연 초기화할 때 사용
- 변수 val로 선언한 후, by lazy 키워드 사용
-> by lazy뒤 중괄호에 초기화할 값 써주기
(타입 추론 가능 -> 변수 타입 생략 가능)
class Company {
val person: Person by lazy { Person() }
init {
}
fun process(){
print("person의 이름은 ${person.name}")
}
}
- lazy를 사용할 때 주의할 점: 초기화하기 위한 리소스가 너무 큰 경우
-> 호출되는 시점에 초기화 작업 일어남 -> 전체 처리 속도에 악영향
-> 미리 초기화하는게 효율적