lateinit
✔ 변수(프로퍼티)만 Nullable로 미리 선언하고 초기화(생성자 호출)를 나중에 해야 할 경우 Safe Call을 쓰지 않을 수 있기 때문에 코드에서 발생할 수 있는 수많은 ?를 제거할 수 있다.
💬
◽ var로 선언된 클래스의 프로퍼티에만 사용 가능
◽ null은 허용되지 않음
◽ 기본 자료형 Int, Long, Double, Float 등은 사용 불가능
💬
◽ lateinit은 변수를 미리 선언만 해 놓은 방식
◽ 초기화 되지 않은 상태에서 메서드나 프로퍼티를 참조하면 null 예외로 앱이 죽음
◽ ?를 쓰지 않기 위해서 초기화를 한다고 가정하고 사용하는 도구이므로 반드시 초기화가 필요
[ Nullable로 선언하는 일반적인 방법 ]
class Person {
var name: String? = null
init {
name = "Linoel"
}
fun process() {
name?.plus(" Messi")
print("이름의 길이 = ${name?.length}")
print("이름의 첫 결과 = ${name?.substring(0, 1)}")
}
}
[ lateinit을 사용하는 방법 ]
class Person {
lateinit var name: String
init {
name = "Linoel"
}
fun process() {
name.plus(" Messi")
print("이름의 길이 = ${name.length}")
print("이름의 첫 글자 = ${name.substring(0, 1)}")
}
}
lazy
✔ 읽기 전용 변수인 val을 사용하는 지연 초기화이므로 입력값을 변경할 수 없음
class Company {
val person: Person by lazy { Person() }
init {
// lazy는 선언 시에 초기화를 하기 때문에 초기화 과정이 필요 없음
}
fun process() {
print("person의 이름은 ${person.name}") // 최초 호출하는 시점에 초기화
}
}
💬
◽ 선언 시에 초기화 코드를 함께 작성하기 때문에 따로 초기화할 필요가 없음
◽ lazy로 선언된 변수가 최초 호출되는 시점(person.name)에 by lazy { } 안에 넣은 값으로 초기화
◽ 최초 호출되는 시점에 초기화 작업이 일어나기 때문에 초기화 하기까지 코드가 복잡한 경우 전체 처리 속도에 악영향
'Kotlin' 카테고리의 다른 글
[Android] [Kotlin] 스코프 함수 (0) | 2021.08.30 |
---|---|
[Android] [Kotlin] Null Safety (0) | 2021.08.30 |
[Android] [Kotlin] 설계 도구 (0) | 2021.08.30 |
[Android] [Kotlin] 클래스 (0) | 2021.08.30 |
[Android] [Kotlin] 함수 (0) | 2021.08.30 |