[Android] 프로퍼티의 초기화 시점이 중요한 이유!

2024. 1. 28. 03:37·Android

🚨 Trouble Shooting

다음과 같이 context를 매개변수로 전달받는 클래스를 TestActivity에서 호출할 때 다음과 같은 에러가 발생했습니다. 파란 줄을 보시면 context를 전달받을 때 null이 전달되어 NullPointerException 이 발생했습니다. 

class FusedLocationProvider (
    private val context: Context,
    private val listener: OnLocationUpdateListener
)

class TestActivity: AppCompatActivity(), OnLocationUpdateListener {

    private var fusedLocationProvider = FusedLocationProvider(this, this)

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

    }
}

 

원인을 파악하면서 TestActivity Class에서 FusedLocationProvider( ) Class를 생성할 때 분명 context 객체를 전달해 줬는데 Null이 전달된 이유에 대해 생각하다 이런 생각이 들었습니다.

Activity가 완전히 생성되기 전에 this를 사용하면 context가 생성 되지 않지 않을까?

 

FusedLocationProvider( ) 의 매개변수로 전달되는 context는 액티비티에서 사용할 경우 this 지시어를 사용해 전달하는데 이 this는 TestActivity의 인스턴스를 의미합니다.  안드로이드 액티비티의 경우, onCreate() 메서드가 호출되기 전에는 액티비티가 완전히 생성되지 않았기 때문에 액티비티의 인스턴스를 사용할 수 없습니다.

 

그래서 이 액티비티가 완전히 생성되기 전에 클래스를 TestActivity의 프로퍼티로 생성해 문제가 발생했던 것이었습니다.

 

지연 초기화를 사용하면 TestActivity의 인스턴스가 생성된 후에야 프로퍼티에 값을 할당할 수 있으므로 이러한 문제를 방지할 수 있습니다.

class TestActivity: AppCompatActivity(), OnLocationUpdateListener {

    private lateinit var fusedLocationProvider: FusedLocationProvider

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

        fusedLocationProvider = FusedLocationProvider(this, this)
    }

 

안드로이드를 공부한 지 1년 만에 알게 된 사실입니다. 별거 아닌 거 같아도 옛날이었으면 생각도 못했을 탠데 클래스와 프로퍼티의 구조를 정확히 이해하게 된 거 같아서 뿌듯하네요 🤗

'Android' 카테고리의 다른 글

ViewLifeCycleOwner 제대로 알고 사용해보자  (1) 2024.04.28
Room Like + StateFlow debouce와 Throttle  (1) 2024.03.31
[Android] Room Database Migration  (1) 2024.01.21
[Android] Room TypeConverter  (0) 2024.01.21
[Android] Room Database  (0) 2024.01.21
'Android' 카테고리의 다른 글
  • ViewLifeCycleOwner 제대로 알고 사용해보자
  • Room Like + StateFlow debouce와 Throttle
  • [Android] Room Database Migration
  • [Android] Room TypeConverter
빨주노초홍명보
빨주노초홍명보
  • 빨주노초홍명보
    과거의 나를 통해 미래의 나를 성장시키자
    빨주노초홍명보
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • TEKHIT ANDROID SCHOOL (4)
      • Android Architecture (7)
      • Android (40)
      • PROJECT (5)
      • KOTLIN (10)
        • 코루틴의 정석 (3)
      • BACK END (12)
      • CS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DI
    orbit
    sealed class vs enum class
    Clean Architecture
    Livedata
    ThrottleFirst
    kotlin 타입 소거
    kotlin interface
    sealed class
    kotlin interface abstract 차이
    flow
    kotlin interface vs abstract
    리사이클러뷰 풀
    saeled class enum class 차이
    value class
    android Room
    interface vs abstract
    callbackflow
    Room
    Throttle
    의존성 주입
    MVI
    Repository Pattern
    STATEFLOW
    코틀린 코루틴의 정석
    android clean architecture
    kotlin array
    repository
    kotlin abstract class
    DataSource
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
빨주노초홍명보
[Android] 프로퍼티의 초기화 시점이 중요한 이유!
상단으로

티스토리툴바