안드로이드 개발 중 엑티비티나 프레그먼트사이에 클래스 데이터를 전송하려면 Serialzable과 Parcelable중 하나를 선택하여 사용하여야 클래스 데이터값을 전송할 수 있다. 그렇다면 두개의 차이점은 무엇일까?
Serializable은 객체 데이터를 연속적인 데이터로 변형해서 데이터를 읽을 수 있도록 하는 것이다. 이 직렬화를 다시 사용하게 해주는 기능을 Deserialization(역직렬화)라고하는데, 둘이 함께 작동해서 데이터 객체를 이식 가능한 형식으로 변환, 재작성한다.
직렬화는 서로 다른 메모리 영역을 갖는 컴포넌트 간 객체를 주고받을 때 사용하게 된다. 객체는 대부분 다른 객체를 가리키는 참조 필드를 가지고 있는데, 이 주소값을 다른 메모리에서 사용할 수 없기 때문에 이 참조 변수를 가르키는 실제 값으로 변환하는 작업이 필요로한다. Serializable은 이러한 작업을 해주는 역할을 하게 된다.
사용하기 편하다, 따로 구현할 코드가 없다
Reflection을 사용하기 때문에 느리고 메모리를 많이 쓴다.
Java에서 제공하는 API. 런타임 객체의 정보를 분석하는 기법으로. Serialization을 사용하게되면 과정중에 여러 중간 객체가 생성되고, 이를 GC(Garbage Collection)를 통해 제거하는 과정에서 메모리와 CPU를 사용하게되어 리소스가 많이 소모되게 된다.
parcel은 한국어로 '꾸러미' 라는 뜻으로, 짐을 싸듯이 객체를 싸는 클래스가 Parcel 클래스이다. parcelable은 Reflection이 런타임에 하는 작업을 개발자가 대신 하여 개발자가 직접 직렬화, 역직렬화 하는 로직을 작성하여야 한다.
Parcel 클래스는 직렬화시 Container역할을 하게된다.
Serializable에 비해 빠르고 리소스를 덜 소모한다.
Reflection 과정 없이 미리 작성된 로직을 바탕으로 빠르게 직렬화/역직렬화 할 수 있다.
직접 작성해야 하는 코드가 많다. class안에 constructor를 지정해주어야하고, writeToParcel(), describeContents(), CREATOR, newArray()를 설정해주어야 한다.
둘 중에 어떤게 사용하는것이 좋을까? 리소스를 최대한 줄이려면 parcelable을 사용하는게 좋겠지만, 하드웨어 성능이 좋아진 현재 상황에서는 serialzable을 사용해도 되는 것이 아닐까?
코틀린에는 이러한 두 방법을 섞어서 사용하는 기능이 있다.
코틀린은 pareclize를 제공하고 있다. parcelize는 serialzable의 간편함과 parcelable의 속도 장점을 모두 누릴수 있는 기술로, parcelable의 구현을 자동으로 생성해준다.
사용하려면 플러그인 선언과, @parcelize 어노테이션을 달고 리턴값을 Parcelable로 지정해주면 된다
plugins{
id("kotiln-parcelize")
}
import kotlinx.parcelize.Parcelize
@parcelize
class test(val abc:String, val test2:String): Parcelable
이런식으로 구형하면 Parcelize를 사용할 수 있다.