[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개의 댓글

관련 채용 정보