본문 바로가기

Android 공부

26. 안드로이드 Bundle & Parcelable

안드로이드 activity 의 생명주기에 대하여 공부할 때 bundle 이라는 단어가 등장한다. 생명주기를 배우는 단계에서는 bundle 을 간단하게 값을 저장하는 Map 으로 짚고 넘어갔기 때문에 이번 게시물에서 bundle 과 parcelable 을 묶어서 정리하려 한다. 

 


Bundle 은 여러 타입의 값을 저장하는 Map class이다.

 

1. bundle 은 먼저 데이터 저장을 돕는 객체로 상태 저장 및 복구에 사용된다.

 

이는 생명주기와 관련해서도 설명할 수 있다. activity 의 생명주기인 onStop( ) 전에 onSavedInstanceState 에서 데이터를 bundle 에 저장한다. 그리고 다시 activity 가 시작되는 onStart( ) 가 이루어지고 난 후에 onRestoreInstanceState 에서 복구가 이루어진다. 

 

2. bundle 은 복구 뿐 아니라 전달에도 사용되는데, Activity 등의 구성요소 간의 데이터를 주고 받을 때 bundle 클래스가 사용된다. 

 

Intent 의 extra 를 이용하여 다른 구성요소에 데이터를 전달하는 과정에서 사용되는 것이 bundle 객체이다. Intent 에서 putExtra 를 사용하여 전달하는 코드에서는 new Bundle 클래스가 생성되면서 데이터가 전송되는 것이다. 

 


위에서 Bundle 을 설명하면서 "여러 타입" 이라는 표현을 사용했다. 여기는 Integer 등의 primitive type 뿐 아니라 parcelable 등의 커스텀 객체도 포함된다. 

 

Parcelable 은 직렬화 하는 인터페이스 중 하나로 객체를 묶어주고 풀어주기 위한 Interface 이다. 

 

activity 간 데이터를 공유해야 하는 경우 intent 를 하나 생성하고 putExtra( ) 로 데이터를 넣어 데이터를 공유한다. 앞에서 bundle 을 사용하는 경우가 여기에 해당한다. 이때 primitive type 은 바로 넣어주면 되지만 객체의 경우는 직렬화된 상태로 전달해야 한다. 이 직렬화를 도와주는 것이 parcelable 이다. 

 

 

직렬화라고 하면 Serializable을 생각하는 사람도 많을 것이다. 

Serializable 은 자바의 표준 인터페이스로 직렬화를 가능하게 한다. 간단하게 구현 가능하지만 내부적으로 가비지 콜렉션이 발생하여 성능이 떨어진다는 단점을 가진다. 반면 Parcelable 은 안드로이드 SDK 포함 인터페이스로 불필요한 객체를 덜 생성하여 성능이 더 높다는 차이가 존재한다.