본문 바로가기
Android/Technique

[안드로이드] UI 요소 지연 초기화

by SungJe 2021. 6. 11.

1. 개요

코틀린에서 Non-null로 선언된 프로퍼티는 선언과 동시에 초기화해야 한다. 만일 초기화 하지 않으면 'Property must be initialized or be abstract' 라는 에러 메시지가 발생한다.
특정 UI 요소를 여러 콜백 함수에서 사용할 때 지연 초기화를 사용하면 유용하다.

2. 지연 초기화 기법

코틀린에서 지연 초기화를 위한 두 가지 방법을 제공한다.

자세한 내용은 공식 사이트를 참고한다.

3. 소스코드

다음은 MainActivity.kt의 일부 소스코드이다.

class MainActivity : AppCompatActivity() {
    private lateinit var displayTextView: TextView // ①
    private val clickButton: Button by lazy { // ②
        findViewById<Button>(R.id.main_btn_click)
    }
//    var button: Button // Error: Property must be initialized or be abstract

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        displayTextView = findViewById<TextView>(R.id.main_tv_display) // ③
        clickButton.setOnClickListener { // ④
            displayTextView.text = getString(R.string.main_clickmessage)
        }
    }
}

lateinit 프로퍼티를 ①에서 선언하였고 실제 초기화는 ③의 시점에서 이루어진다. 또 by lazy를 이용한 지연 초기화는 ②에서 이루어지고 clickButton에 처음 접근하는 ④가 실행되는 순간 초기화된다.