목표
- Parcel의 특징을 이해한다.
- Parcelable의 특징을 이해한다.
Parcel이란?
Parcel이란 무엇일까? 먼저 번역을 해보는 것이 이해에 도움이 될 것이다. Parcel은 한국어로 '꾸러미'라는 뜻이다. 짐을 싸듯이 객체를 싸는 클래스가 바로 Parcel 클래스이다.
Parcel 클래스는 직렬화시 Container역할을 하는 클래스로 말 그대로 꾸러미이다.
Parcel이 필요한 이유
안드로이드에서는 프로세스간 통신(IPC)을 위해 Bundle 클래스를 사용하는데, 이러한 Bundle Class는 Map으로 Key와 Value가 있는 형태의 클래스이다. 이러한 Bundle에서 Int나 String 같은 간단한 데이터는 그대로 Value 값으로 넣을 수 있지만, Java의 POJO나 Beans 혹은 Kotlin의 data class와 같은 것들은 내부에 많은 데이터가 들어 있기 때문에 Map에 Value로 입력하는 것이 어렵다.
이러한 문제점을 개선하여 Bundle에 Value값으로 입력될 수 있는 것이 바로 Parcel이다.
아마 여기까지 읽은 분들 중 많은 분들은 그러면 Serializable를 이용하여 직렬화 시켜 전달하면 되지 않는지에 대해 의문을 가질 수 있다. 실제로 Parcel은 Serializable에 의해 생성된 String과 같은 역할을 하는 것이 맞고 Bundle에 Serializable을 객체를 넣을 수 있다. 하지만, Android에서는 더 효율적으로 데이터를 전달하기 위해 리플렉션을 사용하지 않는 Parcelable Interface를 사용하여 Parcel(꾸러미)를 만들어 Bundle(Map)에 넣어준다.
실제로 이에 대해 실험한 결과도 있다. 참조 링크
위 링크에 따르면 Parcelable은 Serializable에 비해 10배 이상 빠른 속도가 나온다고 한다.
Parcelable이란?
Parcelable Interface는 Parcel(꾸러미)을 만들고 비직렬화(풀어주기)하기 위한 인터페이스이다. Parcelable 객체는 Parcel로 만들고 풀 수 있다. Parcelable을 이용하게 되면 Serializable과 다르게 리플랙션을 사용하지 않고, 필요한 부분만을 직렬화하고 비직렬화 할 수 있도록 만들 수 있어 효율성을 향상시킬 수 있다.
Parcelable의 기존 한계와 문제점
Parcelable을 구현하는 것은 직접 구현해야 하기 때문에 보일러 플레이트 코드(비슷한 코드가 반복되는 것)가 생기게 되며, Serializable에 비해 코드 작성 시간이 오래 걸리게 된다.
하지만, 최근에 이를 해결해줄 코틀린 플러그인이 나와 아래에서 간단하게 소개한다.
kotlin-parcelize plugin
1. 모듈 수준의 plugin에 다음의 plugin을 추가한다.
plugins {
..
id 'kotlin-parcelize'
}
2. @Parcelize Annotaion을 data class 위에 추가해주고 뒤에 Parcelable을 implement 시킨다.
@Parcelize
data class Project(
val id: Int,
var projectName: String,
var isShow: Boolean,
var colorInt: Int
) : Parcelable
하지만, 이 조차도 모든 타입을 지원하는 것은 아니고, 이미 구현된 클래스에 대한 Parcelable을 구현해주는 것이라 추가로 구현해야 하는 클래스들이 있을 수 있다. 이에 대한 것은 아래 링크를 참조하자
*참조 : developer.android.com/kotlin/parcelize