-
Serializable 과 Parcelable개발/안드로이드 2021. 6. 19. 14:03
Serializable
Serialization(직렬화)란 자바 시스템 내부에서 사용하는 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte형태로 데이터를 변환시키는 기술을 말하며 안드로이드 상에선 직렬화를 이용해 액티비티간 또는 서비스간 클래스 타입의 데이터를 주고 받는 용도로 주로 사용한다
아래 처럼 Student 클래스를 Serializable 선언 해준다면, 다른 액티비티에 클래스 형태 그대로 값을 전달 해줄 수 있다. Serializaable 선언 외에 추가하는 코드가 없어서 사용하기 정말 편리하다.
data class Student(val name: String, val age: Int) : Serializable val intent = Intent().apply { this.putExtra("student", Student("kwony", 30)) } startActivity(intent)
그러나 Serializable은 byte 형태로 변환된 데이터를 다시 객체의 형태로 변환시키는데 JVM 내부에서 임시 객체를 많이 만들게 되고 이 과정에서 garbage 가 생길 우려가 있다. 안드로이드의 경우에는 배터리 전력을 감소시키기도 한다는데 정확히 어느정도 영향이 있는지 수치가 나온것은 없다. 성능에 미치는 영향이 있다는 점은 기억해둘 필요가 있을 것 같다.
Parcelable
자바 시스템 공용인 Serializable과 달리 Parcelable은 안드로이드 SDK에서 포함하는 인터페이스다. Serializable 이 갖고 있는 변환 과정에서의 성능 저하를 보완하기 위해 만들어졌는데 이 방법이 변환하는 부분을 개발자가 직접 하게끔(?) 하는 것이다. 그래서 Parcelable 인터페이스 상속 함수를 구현해야 하는데 아래 코드처럼 구현해야할 게 많아졌다.
data class Student(val name: String?, val age: Int) : Parcelable { constructor(parcel: Parcel) : this( parcel.readString(), parcel.readInt() ) override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel?, flags: Int) { dest?.writeString(name) dest?.writeInt(age) } companion object CREATOR : Parcelable.Creator<Student> { override fun createFromParcel(parcel: Parcel): Student { return Student(parcel) } override fun newArray(size: Int): Array<Student?> { return arrayOfNulls(size) } } }
코틀린을 사용한다면 @Parcelize 어노테이션을 사용하면 추가 함수 구현 없이 사용 가능하다. 몇몇 클래스에서는 어노테이션이 동작하지 않는 경우도 있는데 그럴때만 빼면 쓸만하다.
@Parcelize data class Student(val name: String?, val age: Int) : Parcelable {}
Performance
디바이스별로 Serializable과 Parcelable을 사용한 경우를 각각 비교한 그래프다. 그래프만 봐선 Parcelable의 성능이 확실히 뛰어난 것 같다. Real World에선 어떤 차이가 있을지 나온 자료는 아니지만 기억해두면 좋을 그래프 일 것 같다.
'개발 > 안드로이드' 카테고리의 다른 글
suspend fun (0) 2021.07.22 Single, Maybe, Completable (0) 2021.07.04 kotlin lateinit, lazy by (0) 2021.06.05 Kotlin - Coroutine (0) 2021.05.21 Android 10 스토리지 정책 대처하기 (2) 2021.05.18