[android : kotlin] 코틀린 lateinit, lazy 사용방법 및 예제
코틀린 lateinit, lazy 사용방법
자바에는 없는 lateinit와 lazy에 대해 알아봅니다. 코드 예제를 먼저 보아요.
아래 코드 스니펫(Code Snippet)에서 보는 것처럼 mediaPlayer객체를 전역 변수로 선언 후 초기화를 나중에 하기 위해 null 값을 지정하였습니다. 그리고 onCreate()되는 시점에서 초기화를 해주고 있습니다. 이것을 늦은 초기화라고 부르겠습니다. 무조건 적으로 사용하는 객체가 아니라면 , 필수 사용 변수가 아니라면 초기화를 나중에 해주는 것입니다. 이처럼 코틀린언어는 늦은 초기화를 하려면 null 값을 초기에 명시해야합니다.
package edu.kotlin.study
import android.media.MediaPlayer
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private var mediaPlayer: MediaPlayer? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mediaPlayer = MediaPlayer.create(this, R.raw.bts_dynamite)
mediaPlayer?.start()
}
}
lateinit 키워드를 사용한 늦은 초기화
전역변수로 선언 후 null값을 지정하지 않고 초기화 하는 방법이 있습니다. 그것이 바로 lateinit 키워드를 사용한 초기화 방법입니다. var 키워드를 사용하여 선언한 경우에만 lateinit를 사용할 수 있습니다. val 키워드를 사용하여 선언한 경우에는 사용할 수 없어요. 그리고 primitive type에 적용할 수 없습니다. primitive type은 Int, Boolean, Double 등의 코틀린에서 제공하는 기본적인 타입을 의미합니다. 또한 getter&setter를 정의할 수 없습니다.
아래 코드 스니펫을 보면 이해가 되실 겁니다.
package edu.kotlin.study import android.media.MediaPlayer import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { private lateinit var mediaPlayer: MediaPlayer override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mediaPlayer = MediaPlayer.create(this, R.raw.bts_dynamite) mediaPlayer.start() } }
lateinit 키워드를 사용하여 초기화한 경우 변수가 초기화 되었는지 확인 후 사용해야하겠지요? 안전한 접근을 위해서말입니다. 아래 코드 스니펫에서 보는 것처림 ::(콜론2개)를 통해서만 접근이 가능해요. 그래야만 isInitialized를 사용하여 체크할 수 있습니다. 초기화를 하지 않고 사용하는 경우 오류가 발생합니다.
mediaPlayer = MediaPlayer.create(this, R.raw.bts_dynamite) if (::mediaPlayer.isInitialized) { mediaPlayer.start() }
lazy 키워드를 사용한 늦은 초기화
lazy를 사용하는 경우, var를 사용할 수 없습니다. val을 사용하는 경우에만 가능합니다. val 선언 뒤 by lazy 블록에서 초기화에 필요한 코드를 작성합니다. 호출시점에서 최초 1회 초기화가 됩니다. lateinit 와 다르게 선언과 동시에 초기화를 해야합니다. 변수 선언과 동시에 초기화를 선언하고 있지만 호출시점에서 초기화가 이루어짐으로 늦은 초기화라고 합니다.
package edu.kotlin.study import android.media.MediaPlayer import android.os.Bundle import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { // 선언과 동시에 초기화해요. private val mediaPlayer: MediaPlayer by lazy { MediaPlayer.create(this, R.raw.bts_dynamite) } private val textView1: TextView by lazy { findViewById<TextView>(R.id.textView1) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //호출되는 시점에 초기화되요. mediaPlayer.start() textView1.text = "HELLO~~~~~~" } }
그렇다면 왜 늦은 초기화를 사용할까요?
변수 선언 후 초기화시 null로 선언할 필요가 없을 때 사용합니다.
메모리 사용 측면에서 이득을 볼 수 있다고 하는데…요즘 휴대폰 메모리 넘쳐나는데… 이렇게 까지 해야하나 싶네요. 뭐 개발자 취향이죠. 휴대폰 성능은 제조사에서 잘 만들어 주자나요.
[REFERENCE]
코틀린공식문서 Late-Initialized Properties and Variable
[코틀린 더 알아보기]
[android : kotlin] 코틀린 자료형 검사 : is , Any, as? 키워드 사용하기 & 사용 예시
[android : kotlin] 코틀린 JSON파싱(JSONObject, JSONArray) 방법 및 예제
[android : kotlin] 코틀린 lateinit, lazy 사용방법 및 예제