관리 메뉴

나만을 위한 블로그

[Manifest-Android] 3. 직렬화 / 역직렬화 본문

스터디

[Manifest-Android] 3. 직렬화 / 역직렬화

참깨빵위에참깨빵_ 2025. 6. 13. 00:48
728x90
반응형

둘 다 서로 다른 컴포넌트(액티비티, 프래그먼트) 간에 데이터 전달 시 쓰지만 성능, 구현 면에서 다르게 작동한다.

 

Serializable

 

  • 자바 표준 인터페이스 : 객체를 바이트 스트림으로 바꿔 액티비티 간에 전달하거나 디스크에 쓸 때 사용하는 표준 자바 인터페이스다
  • 리플렉션 기반 : 자바 리플렉션으로 작동해서 시스템이 런타임에 클래스, 필드를 동적 검사해 객체를 직렬화
  • 성능 : 리플렉션은 느린 프로세스기 때문에 Parcelable보다 느리고 직렬화하는 동안 많은 임시 객체를 만들어 메모리 오버헤드가 증가
  • 사용 사례 : 성능이 중요하지 않은 시나리오, 안드로이드 전용이 아닌 코드를 다룰 때

 

Parcelable

 

  • 안드로이드 전용 인터페이스 : 안드로이드 컴포넌트 안의 고성능 프로세스 간 통신(IPC3)을 위해 설계된 안드 전용 인터페이스
  • 성능 : 안드로이드에 최적화됐고 리플렉션에 의존하지 않아서 Serializable보다 빠르다. 임시 객체를 많이 만들지도 않아서 가비지 컬렉션을 최소화한다
  • 사용 사례 : 성능이 중요한 경우, 액티비티 or 서비스 간에 데이터를 전달하는 등 안드로이드에서 데이터를 보내는 작업 시 선호됨

 

플러그인 중 kotlin-parcelize는 구현을 자동 생성해서 Parcelable 객체를 만드는 프로세스를 간소화한다. 클래스에 @Parcelize를 추가하면 플러그인이 필요한 Parcelable 구현을 만든다. 이렇게 하면 writeToParcel() 등 함수를 재정의할 필요가 없어 보일러 플레이트가 줄어든다.

 

import kotlinx.parcelize.Parcelize
import android.os.Parcelable
 
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int) : Parcelable

 

대부분의 사용 사례에서 더 나은 성능을 제공하는 Parcelable이 권장되는 접근 방식이다.

@Parcelize는 당연히 data class에서도 사용 가능한데 data class 안에서 다른 data class를 사용하는 상태에서 외부 data class에 @Parcelize를 사용하면 내부 data class에도 @Parcelize를 사용해야 한다. 그렇지 않으면 컴파일 에러가 발생한다.

반응형
Comments