개발여행일지~
지연 초기화를 알아보자! 본문
클래스에서는 기본적으로 선언하는 프로퍼티 자료형들은 null을 가질 수 없다.
하지만 객체의 정보가 나중에 나타나는 경우 나중에 초기화 할 수 있는 방법이 필요하다.
그런 경우에 lateinit 과 lazy 키워드를 사용하여 지연 초기화를 한다.
Lazy
- val 에서만 사용이 가능하다.
- 값을 교체 불가능하다.
- 호출 시점에 by lazy { ... } 에 정의해둔 블록 부분의 초기화를 진행한다.
- 클래스 생성자에서 사용이 불가능하다.
- 원시 타입 (primitive type) 도 사용이 가능하다.
- 지역 변수에서도 사용이 가능하다.
private val adapter: BookListAdapter by lazy {
BookListAdapter()
}
초기화를 지연시킬 때 사용합니다. 차이점은 선언과 동시에 초기화할 값을 지정해줍니다. 이후에 호출 시점에 lazy { }에 정의한 값을 초기화합니다. lazy도 다음과 같은 제약사항이 있습니다.
lateinit
- var(mutable) 에서만 사용이 가능
- var이기 때문에 언제든 초기화를 변경할 수 있음
- null을 통한 초기화를 할 수 없음
- primitive type 사용 불가능
- 초기화를 하기 전에는 변수에 접근 불가
- 변수에 대한 custom setter/getter properties 정의가 불가능
- 로컬 변수로 사용 불가능
class LazyInitialization {
private lateinit var name: String
}
초기화 지연 프로퍼티(Late-initialized property)라고 하며 프로퍼티의 초기화를 나중에 하기 위해 사용하는 키워드입니다. 항상 사용할 수는 없고 다음과 같이 몇 가지 제약 사항이 있습니다.
해당 변수가 초기화되었는지 확인하기 위해서는 다음과 같은 코드를 사용하면 됩니다. (return값은 Boolean)
if (::변수.isInitialized) {
// check then do something
}
느낀점
지연 초기화가 뭔지 정확히 모르고 그냥 인터넷보면서 무작정 카피하며 코드를 짜왔었던거같다.
오늘 공부한걸 토대로 다음 코드를 짤때 좀 더 기능을 알고 사용하도록 해야겠다.
'코틀린 공부정리' 카테고리의 다른 글
Manifest에서 Activity의 name이 오류가 뜨는 문제 (0) | 2023.10.13 |
---|---|
파이어베이스(Firebase)란 무엇인가! (0) | 2023.10.12 |
Binding하면서 알게된 것 (0) | 2023.09.01 |
RecyclerView 공부하기!! (0) | 2023.08.28 |
뷰 바인딩 (View Bindiing) (0) | 2023.08.22 |