일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 코딩테스트
- 프로그래머스
- 코틀린
- Swift 문법
- 안드로이드 다이얼로그
- 개발자
- 잡담
- android compose
- Flutter
- RxKotiln
- Kotiln
- RxJava
- react
- Dev6
- Firebase
- 알고리즘
- 반응형 프로그래밍
- 안드로이드 컴포즈
- 안드로이드
- 안드로이드 클린아키텍쳐
- 코루틴
- MVVM
- 이펙티브코틀린
- Java
- Kotlin
- Go언어
- Rxjava 안드로이드
- 안드로이드 개발자
- android
- 이펙티브 코틀린
- Today
- Total
최데브는 오늘도 프로그래밍을 한다.
lateinit 과 lazy의 차이점 본문
lateinit과 lazy 는 늦은 초기화를 하게 해주는 키워드다.
늦은 초기화가 뭘까?
늦은 초기화는 선언과 동시에 값을 가져오기 곤란한 상황에 뒤에 이 변수를 초기화 해줄 수 있는 시점이 됐을 때
초기화를 하도록 미뤄주는 역할을 한다.
생각보다 쓸 일이 자주 생기는데 두가지 방법에는 차이가 있다.
먼저 lazy 에 대한 이야기다.
오늘 업무를 진행하다가
Dialog 와 관련된 작업을 할 일이 있었다.
순간 고민이 생겼는데 Dialog를 생성할때 중복되는 내용들을 baseDialog 로 만들어서 부모 클래스로 만들어뒀는데
여기서 높이와 넓이를 부모클래스에서 값을 받도록 하고 있어서 작업하려던 Dialog 에서 override 하고 있는 곳에
값을 넣어 줄 상황이 생겼다.
고정 값으로 값을 집어넣어주면 상관 없었지만 Dialog 마다 크기가 달랐고 디스플레이 화면에 따라
맞춰서 크기를 지원하고 싶었다. 그래서 비율을 계산했어야했는데
val params: ViewGroup.LayoutParams? = dialog?.window?.attributes
val deviceWidth = size.x
params?.width = (deviceWidth * 0.9).toInt()
이런 방식을 통해 넓이의 비율을 조정할 수 있었지만 이걸 override 하고 있는 변수에 집어 넣을 수는 없었다.
그래서 떠올린 방안이 lazy 였다.
lazy는 val 키워드를 사용하여 선언한 경우에만 사용할 수 있는데
해당 변수가 코드가 진행되며 최초 1회 호출 될때 초기화가 진행된다.
baseDialog 는 onResum 생명주기에서 Dialog 의 크기를 주입하고 있었는데
이 점을 이용해서 구현하고 있는 Dialog 의 생성 시점에 넓이를 lazy로 초기화하여 baseDialog 의 onResume으로
진행하기전에 값을 먼저 받고 lazy로 초기화 된 다음 전달이 되도록 구현해서
정상적으로 작동하게 구현되게 만들었다.
다음은 lateinit 이다.
lazy와는 다르게 var 키워드로 선언한 경우에 쓸 수 있다. 또한 primitive type에는 쓸 수 없다. 이런 타입은
int , boolean ,double 등 코틀린에서 제공하는 기본 타입이다.
사용법은 단순하다.
private lateinit var test : MediaPlayer
onCreate(..){
test = MediaPlayer.create(this , R.raw.test)
test.start()
}
이렇게 쓰면 된다.
내가 필요한 시점에 초기화해서 사용하면 되고 추가적으로
private lateinit var test : MediaPlayer
onCreate(..){
test = MediaPlayer.create(this , R.raw.test)
if(::test.isInitialized){
test.start()
}
}
이렇게 적어서 초기화가 잘 됐는지 확인하고 사용할수도 있다.
'Kotlin' 카테고리의 다른 글
Kotlin Type aliases (0) | 2022.07.10 |
---|---|
DeciamlFormat 으로 숫자 천단위로 콤마 넣기 (0) | 2021.10.07 |
람다식에서 return 사용하기 (0) | 2021.05.02 |
Java Kotlin 차이점 (0) | 2021.05.01 |
코틀린 커스텀 다이얼로그 (0) | 2021.04.25 |