티스토리 뷰
728x90
Kotlin은 NPE(NullPointerException)를 사전에 방지하기 위해 모든 프로퍼티(Property)를 반드시 초기화를 해야 합니다. 이런 코틀린에서는 성능향상 및 메모리 사용 공간을 줄이기 위해 변수선언을 먼저 하고 초기화를 뒤로 미루는 지연 초기화(지연 인스턴스화)를 지원합니다.
1. lateinit (지연 초기화)
lateinit은 지연 초기화로 kotlin에서 변수를 선언할 때 반드시 초기화를 해주어야 하지만 해당 변수가 언제 초기화될지 알 수 없지만 반드시 초기화가 되고 이후에 사용된다는 것이 보장될 경우 lateinit을 사용합니다.
lateinit 지연 초기화는 나중에 값을 할당하여 초기화를 수행하므로 var를 사용하여 변수를 선언합니다.
- var로 선언된 프로퍼티에만 사용이 가능합니다.
- Non-null 프로퍼티에서만 사용이 가능합니다.
- 객체가 보이는 어느 곳에서든 초기화가 가능합니다.
- 초기화 전까지 접근이 불가능하며, 접근 시 Exception을 발생합니다.
- Kotlin Primitive Type(Int, Double, Float, Boolean,...)에서는 사용이 불가능합니다.
- getter, setter를 만들 수 없습니다.
- 초기화되면 해당 속성. isInitialized를 true를 반환합니다.
lateinit이 초기화 확인 여부는 var 변수 이름 앞에 ::(콜론 2개)를 붙이고. isInitialized를 사용하면 됩니다.
// 초기화 확인 여부 //
fun main() {
lateinit var str: String
if (::str.isInitialized) {
str = "새로운 값으로 할당"
} else {
str = "초기값"
}
}
2. by lazy (초기화 미루기 or 사용시점에 초기화)
by lazy는 lateinit과 달리 val 변수를 사용해야 합니다.
val 변수이므로 값을 변경할 수 없고, 초기화 시점은 변수가 최초로 사용되는 시점에 초기화합니다.
- 변수를 접근 시점에 by lazy {... }의 함수 리터럴을 통해 초기화를 합니다.
- val에서만 사용이 가능하며 당연히 값을 변경할 수 없습니다.
- by lazy는 람다식으로 구성되어 반환식을 가지는 함수입니다.
- 람다식(Lambda)으로 구성되어 변수를 처음 사용할 때 단 한번 호출되며 마지막 값이 초기값으로 할당됩니다.
// 람다함수로 초기화가 진행되므로 함수안에 여러개의 구문이 등러갈수 있으며
// 맨 마지막 구문의 결과가 변수에 할당됩니다.
fun main() {
val num : Int by lazy {
println("초기화")
10
}
println(num) // 처음 호출시 초기화
println(num) // 이미 초기화되므로 다시 초기화 하지 않음
}
/* 출력 결과
* 초기화
* 10
* 10
*/
728x90
'프로그램개발' 카테고리의 다른 글
[ PHP ] __DIR__ 또는 __FILE__ 등 마법상수(magic constants) (0) | 2024.07.25 |
---|---|
[ Kotlin ] 플로팅 액션 버튼(FAB) (0) | 2024.07.24 |
[ PHP ] 이미지에 워터마크 넣기 (0) | 2024.07.19 |
[ Jquery ] 제이쿼리 선택자(Selector) (0) | 2024.07.17 |
[ PHP ] 다중 또는 다차원 배열 정렬(array_multisort) (0) | 2024.07.05 |