728x90

Parcelable과 Serializable은 객체를 직렬화하여 전달하기 위한 방법이다.

 

직렬화 : 객체들의 데이터를 연속적인 데이터(스트림)로 변형하여 전송 가능한 형태로 만드는 것
역직렬화 : 직렬화된 데이터를 다시 객체의 형태로 만드는 것

 

객체 데이터를 통신하기 쉬운 포맷(Byte, CSV, Json..) 형태로 만들어주는 작업을 직렬화라고 볼 수 있고,
역으로, 포멧(Byte,CSV,Json..) 형태에서 객체로 변환하는 과정을 역직렬화라고 할 수 있겠다.

 

(이해에 도움이 될 수도 있음)

Parcel 이란 한국어로 꾸러미 라는 뜻이다. 객체를 싸는 클래스가 바로 Parcel 클래스 

Parcel 이 필요한 이유

안드로이드에서 프로세스 간 통신을 위해 Bundle 을 사용하는데, Key 와 Value 쌍으로 이루어져 있는 형태이다. 

이러한 Bundle 에서 원시타입(Primitive Type) Int, String, boolean.... 같은 간단한 데이터는 그대로 Value 값으로 넣을 수 있지만, Kotlin의 data class 같은 것들은 내부에 많은 데이터가 들어 있기 때문에 Map에 Value 값으로 입력하는 것이 어렵다. 

이런 문제가 있어서 Bundle Value 값으로 입력될 수 있는 것이 Parcel 

 

 

Parcelable와 차이 

Parcelable

  • Parcelable은 안드로이드에서 제공하는 인터페이스로, 객체를 전달하기 위해 사용
  • Parcelable 인터페이스를 구현한 객체는 안드로이드 OS에서 Intent나 Bundle에 담아 전달할 수 있음
  • Parcelable을 사용하면 객체를 직렬화하여 안드로이드 OS에서 처리할 수 있는 바이트 배열로 변환하여 전달

Serializable

  • Serializable은 Java에서 제공하는 인터페이스로, 객체를 직렬화하여 전달하기 위해 사용
  • Serializable을 사용하면 객체를 바이트 스트림으로 변환하여 전달할 수 있음
  • Serializable 인터페이스를 구현한 객체는 Java에서 제공하는 ObjectOutputStream을 사용하여 전달할 수 있음

1. 속도 

  • Parcelable이 Serializable보다 빠름
  • Paecelable은 안드로이드 OS에서 직접 처리하기 때문에 직렬화와 역직렬화 시간이 적고, Serializable은 Java의 Reflection을 사용하기 때문에 상대적으로 느림
  • Serializable은 ObjectOutputStream과 ObjectInputStream을 사용하기 때문에 객체를 직렬화하는 시간이 더 길어 짐

2. 크기 

  • Parcelable은 Java의 Serializable보다 객체를 직렬화할 때 생성되는 데이터 크기가 작음
    • 객체의 멤버 변수들을 Parcel에 쓰기 때문에 필요한 데이터만 쓰게 됨 
  • Serializable은 객체의 모든 데이터를 직렬화하기 때문에 불필요한 데이터까지 모두 쓰게 되어서 상대적으로 데이터 크기가 큼

3. 안정성

  • Parcelable은 Serailizable 보다 안정성이 높음
    • Parcelable은 직렬화와 역직렬화에 대한 오류 검사를 수행하기 때문

4. 그 외

  • Parcelable은 안드로이드 OS에서만 사용할 수 있음
    • Parcelable을 사용하여 전달한 객체는 안드로이드 애플리케이션에서만 사용할 수 있음
    • 객체 크기가 작고 안드로이드 OS에서만 사용하는 경우 Parcelable을, 객체 크기가 크거나 다른 플랫폼과도 호환해야 하는 경우 Serializable을 사용하는 것이 좋음 

 

 

 

+ Recent posts