[kotlin]왜 lazy를 사용하는가

Boknami·2023년 9월 5일
0

코틀린

목록 보기
12/19

코틀린에 대해 학습을 할 때 왜 lazy lateinit같은 것들이 있는 지 감이 잘오지 않았다. 뭔가 초기화 하면 그대로 바로 초기화해서 사용하면 되지 왜 그럴까 싶은 생각이 들면서도 실제로 개발할 때도 필수적이지 않아서 확실히 학습하지 않았다..

실패가 나타난 코드

class setLanguageActivity : BaseActivity() {
    private lateinit var btnKorean: AppCompatButton
    private lateinit var btnChinese: AppCompatButton
    private lateinit var btnEnglish: AppCompatButton
    private lateinit var btnThai: AppCompatButton
    private lateinit var btnJp: AppCompatButton
    private lateinit var language_code: String

	//<----------문제의 부분-------------<
    val dia_title = getString(R.string.dialog_lang)
    val dia_body = getString(R.string.dialog_lang_gomain)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

해당 액티비티에 접속할 때 자동으로 앱이 꺼졌다.
에러 코드를 보니.

FATAL EXCEPTION: main
Process: com.beacon, PID: 30660
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.beacon/com.beacon.settings.language.setLanguageActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources

NullPointerException이 발생했다. 다국어 지원을 위해서 R.string에 언어별로 값을 넣어 놓았는데 그 값들을 Dialog에 띄워주기 위해서 getString을 하고 그 변수들을 사용하려고 했는데 오류가 났다.


원인과 해결

분명히 변수 이름도 똑같고 잘 동작할 것 같은데 잘 안되서 이리저리 찾아보니 내가 전역 변수로 사용하고 싶은 값을 onCreate도 되기 전에 초기화를 했기 때문이다.

<해결>

private val dia_title: String by lazy { getString(R.string.dialog_lang) }
private val dia_body: String by lazy { getString(R.string.dialog_lang_gomain) }

안드로이드에서의 생명주기를 더 깊이 잘 이해했다면 이런 일이 없었을텐데..

onCreate는 생명주기의 첫 시작으로

[1] 활동 초기화

  • 'onCreate' 메서드는 Android가 활동 자체를 초기화
  • 사용자 인터페이스를 설정하고, 레이아웃을 확장하고, 활동에 필요한 리소스를 준비
  • 이 메서드 이전에 리소스에 액세스하거나 복잡한 작업을 수행하려고 하면 활동이 아직 완전히 준비되지 않았기 때문에 오류가 발생할 수 있습니다.

[2] 컨텍스트 및 리소스

문자열과 같은 리소스를 포함한 많은 Android 구성요소가 활동의 컨텍스트에 연결되어 있습니다. 컨텍스트는 애플리케이션 환경에 대한 정보를 제공하며 활동이 생성되면 사용할 수 있게 됩니다. 'onCreate' 이전에 리소스에 액세스하거나 컨텍스트를 사용하려고 하면 컨텍스트를 아직 사용할 수 없기 때문에 'NullPointerExceptions'가 발생할 수 있습니다.

[3] Android 수명 주기

Android의 활동 수명 주기는 앱이 원활하게 작동하고 리소스를 효율적으로 관리하며 일관된 사용자 경험을 유지하도록 보장합니다. 표준 수명 주기 외부에서 변수와 리소스를 초기화하면 이러한 흐름이 중단되고 예측할 수 없는 동작이 발생할 수 있습니다.
'onCreate' 메서드 이전이나 외부에서 변수를 초기화하면 활동이 완전히 설정되기 전에 리소스에 액세스하거나 작업을 수행하려고 하기 때문에 'NullPointerExceptions'와 같은 문제가 발생할 수 있습니다. 올바른 기능을 보장하고 이러한 오류를 방지하려면 변수를 초기화하고, 리소스 관련 작업을 수행하고, onCreate 메서드 또는 기타 적절한 수명 주기 메서드 내에서 활동의 초기 상태를 설정하는 것이 가장 좋습니다.

0개의 댓글