Python

[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

코틀린공식문서 Lazy

[코틀린 더 알아보기]

[android : kotlin] 코틀린 자료형 검사 : is , Any, as? 키워드 사용하기 & 사용 예시

[android : kotlin] 코틀린 JSON파싱(JSONObject, JSONArray) 방법 및 예제

[android : kotlin] 코틀린 lateinit, lazy 사용방법 및 예제

Leave a Reply

error: Content is protected !!