티스토리 뷰

728x90

 

Bundle

Bundle은 데이터를 저장하기 위한 객체다.

키-값 쌍으로 데이터를 저장하기 때문에, Bundle 내부에서는 Map을 사용한다.

 

 

Intent와의 차이점

Intent에서 putExtra()를 통해서도 키-값 쌍으로 저장하는데, 무슨 차이일까?

Intent의 putExtra() 내부에서도 데이터를 저장하기 위해 Bundle을 사용한다

 

예를 들어 putExtra() 내부 코드는 아래와 같을 것이다.

    fun putExtra(name: String, value: String?): Intent {
        if (mExtras == null) {
            mExtras = Bundle()
        }
        mExtras.putString(name, value)
        return this
    }

 

두 객체 모두 Map을 사용하여 데이터를 키-값 쌍으로 저장하지만,

Intent는 Bundle을 통해서 Map에 저장하고, Bundle은 Map에 바로 저장한다는 차이가 있다.

비용적인 측면에서는 후자가, 가독성 측면에서는 전자가 나을 것이다.

 

 

이제 명확한 두 객체의 차이를 알 수 있다.

Intent는 다른 컴포넌트로 이동하는 역할을 하고, 부가적으로 데이터를 전달하는 기능을 제공한다.

Bundle은 주목적이 데이터를 저장하는 것이다.

즉, Intent는 데이터 이동, Bundle은 데이터 저장이라고 말할 수 있다.

 

 

더 자세히 Intent 내부의 Bundle을 알아보자.

Intent에 데이터를 담는 방법은 두 가지가 있다.

Intent(this, SubActivity::class.java).apply {
    putExtra("str", "123")
    putExtra("int", 123)
    putExtra("boolean", true)
    startActivity(this)
}

먼저 putExtra()를 통해 Int, String 값을 하나씩 저장하는 방법이 있다.

 

val str = intent.getStringExtra("str")
val i = intent.getIntExtra("int", 0)
val b = intent.getBooleanExtra("boolean", false)

---

val bundle = intent.getExtras()
val str = bundle.getString("str")
val i = bundle.getInt("int")
val b = bundle.getBoolean("boolean")

받는 쪽에서는 이렇게 하나하나씩 데이터를 가져올 수 있고, getExtras()를 호출해 Bundle 자체를 가져와 

이때, getExtras()의 반환타입이 Bundle이므로 Intent 안에서 putExtra를 통해 데이터를 하나씩 저장해도 결국은 Bundle 하나를 사용한다는 것을 알 수 있다.

 

Intent(this, SubActivity::class.java).apply {
    val bundle = Bundle().apply {
        putString("str", "123")
        putInt("int", 123)
        putBoolean("boolean", true)
    }
    
    putExtra(bundle)
    startActivity(this)
}

또한 putExtras()를 통해 Bundle을 통째로 전달하는 방법이 있다.

 

val bundle = intent.getExtras()
val str = bundle.getString("str")
val i = bundle.getInt("int")
val b = bundle.getBoolean("boolean")

받는 쪽에서는 getExtras()를 사용해 Bundle 자체를 가져온다.

 

Intent에 puExtra()를 통해 데이터를 하나하나 저장하는 방법과,

Bundle을 직접 생성해 putExtras()를 통해 모든 데이터를 한번에 저장하는 방법을 살펴봤다.

전자보다 후자가 코드량이 더 많겠지만, 비용 측면에서는 더 효율적이다.

전자는 Map.put(key, value) 호출을 여러번 하지만, 후자는 Map.putAll(map) 한번 호출하는 것과 동일하기 때문이다.

 

 

savedInstanceState: Bundle

Activity의 onCreate() 함수는 아래와 같다.

override fun onCreate(savedInstanceState: Bundle?)

이때 매개변수인 savedInstanceState의 타입이 Bundle임을 알 수 있다.

 

onCreate()는 화면이 세로 모드에서 가로 모드로 변경되거나 입력 타입이 변경되는 등의 화면 구성이 변경될 때 호출된다.

그럼 그때마다 액티비티의 설정값이 초기화되어 초기 화면 상태로 돌아갈까?

아니다. 초기 화면 상태로 돌아가지 않고 사용자가 보던 화면 그대로인 것을 알 수 있다.

이때 UI 설정값을 저장하는 역할을 하는 객체가 Bundle 타입의 savedInstanceState이다.

 

savedInstanceState가 없다면, 화면 방향이 바뀔 때마다 액티비티가 초기화될 것이다.

즉, 액티비티가 중단되고 다시 시작될 때 savedInstanceState에 저장된 데이터를 기반으로 액티비티를 생성하는 것이다.

 

 

 

 

참조

https://ardor-dev.tistory.com/76 

https://youngest-programming.tistory.com/50 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함