개요
null이라는 것은 값이 설정되지 않았거나, 제거 되었음을 의미한다.
처음에는 null이라는 것이 정말 이해가 안되고, 뭐 저런게 있지? 라는 생각이 있었는데
막상 안드로이드 개발을 하면서 초기 변수를 지정해줄 때 null 만큼 편한게 없다.
하지만, null은 편하게 사용하는 만큼 적절하게 잘 사용해줘야 한다.
까딱 잘못하면 'NullPointerException'과 같은 문제가 런타임에 발생하게 된다.
코틀린은 null을 적절히 사용하기 위해 Elvis연산자(?:) 와 nullable(?)한 타입을 지정할 수 있도록 해주는데
오늘 정리할 lateinit과 lazy도 이를 위해 나온 것이라 생각한다.
late -> 늦은?
lazy -> 게으른?
어감만 봐도 '아 변수에 값을 나중에 넣으려나 보다'라는 의미인게 보인다. 하나씩 정리해보자.
lateinit
fun main(){
lateinit var about : String
val americano = "아메리카노"
about = americano
println(about) // 아메리카노
val latte = "라떼는 말이야"
about = latte
println(about) // 라떼는 말이야
}
lateinit의 경우 위의 코드와 같이 var로 선언해준다.
그렇기 때문에 about에 americano, latte 두 개의 값을 대입해줬던 값을 계속해서 변경 해줄 수 있다.
만약! lateinit으로 변수를 선언해 놓고, 값을 넣어주지 않는다면,
위의 사진과 같이 컴파일 타임에 초기화해달라는 오류가 발생하게 된다.
또한.
lateinit var about : String?
이렇게 nullable하게 작성하면, 위의 사진과 같이 lateinit은 null이 되면 안돼! 라는 오류가 발생하게 된다.
마지막으로, Primitive Type -> Int, Float, Double 등에는 사용할 수 없다고 한다.
by lazy
얘 같은 경우에는 선언 당시 초기화 할 방도가 없는데, 이후 의존하는 값들이 초기화 된 이후 값을 채워넣고 싶을 때 사용한다.
즉, 호출 할 때 어떻게 초기화를 해줄 지에 대해 정의할 수 있다.
val adapter : Adapter by lazy {
Adapter()
}
binding.recyclerView.adapter = adapter
나의 경우 주로 adapter를 사용할 때 쓰는데,
adapter를 recyclerVie의 adapter에 바인딩할 때, 이때! adpater라는 변수가 Adapter()의 인스턴스가 되며 코드가 잘 작동하게 된다.
얘의 경우 단 한번의 늦은 초기화가 이루어지고, 이후 값이 불변함을 보장하기 위해 val로 사용한다.
또한, null을 허용한다.
정리
lateinit
- 값이 계속해서 변할 수 있음.
- null 허용 X
- 초기화해주지 않으면 컴파일 에러가 발생
- Primitive Type은 쓰지 못함
lazy
- 값이 불변
- 호출 시에 by lazy에 선언해준 값으로 들어가게 됨
- null 허용
'Language > kotlin' 카테고리의 다른 글
[Kotlin] 고차 함수와 람다 표현식 (1) | 2024.08.10 |
---|---|
[Kotlin] object와 companion object의 초기화 시점 (0) | 2024.08.09 |
[Kotlin] 오버로딩 & 오버라이딩 (0) | 2024.08.08 |
[Kotlin] Coroutine (0) | 2024.07.23 |
[Kotlin] 스코프함수(Scope function) (1) | 2024.07.05 |