최데브는 오늘도 프로그래밍을 한다.

lateinit 과 lazy의 차이점 본문

Kotlin

lateinit 과 lazy의 차이점

최데브 2022. 3. 15. 20:20

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
Comments