안드로이드에서 왜 Parcelize 가 Serializable 보다 더 권장되는건가요

2024. 9. 9. 02:35카테고리 없음

SMALL

Parcelize가 성능면에서 더 우수한 이유에 대해 자세히 설명해드리겠습니다.

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import java.io.Serializable

@Parcelize
data class ParcelableUser(val name: String, val age: Int) : Parcelable

data class SerializableUser(val name: String, val age: Int) : Serializable

// 사용 예시
fun performanceTest() {
    val parcelableUser = ParcelableUser("Alice", 30)
    val serializableUser = SerializableUser("Bob", 25)

    // Parcelable 사용
    val bundle = android.os.Bundle()
    bundle.putParcelable("parcelable_user", parcelableUser)
    val retrievedParcelableUser = bundle.getParcelable<ParcelableUser>("parcelable_user")

    // Serializable 사용
    val intent = android.content.Intent()
    intent.putExtra("serializable_user", serializableUser)
    val retrievedSerializableUser = intent.getSerializableExtra("serializable_user") as? SerializableUser
}

Parcelize가 더 나은 성능을 제공하는 이유는 다음과 같습니다:

  1. 최적화된 직렬화/역직렬화 프로세스:

    • Parcelable (Parcelize)은 안드로이드 플랫폼에 특화되어 설계되었습니다.
    • 컴파일 타임에 생성된 코드는 객체의 필드를 효율적으로 읽고 쓰는 최적화된 방식을 사용합니다.
    • Serializable은 리플렉션을 사용하여 런타임에 객체 구조를 분석하므로 더 느립니다.
  2. 메모리 사용 효율성:

    • Parcelable은 객체를 바이트 스트림으로 변환할 때 중간 객체 생성을 최소화합니다.
    • Serializable은 직렬화 과정에서 더 많은 임시 객체를 생성하여 가비지 컬렉션 부담을 증가시킵니다.
  3. 안드로이드 시스템 통합:

    • Parcelable은 안드로이드의 Binder IPC 메커니즘과 잘 통합되어 있어, 프로세스 간 통신에서 더 효율적입니다.
    • 안드로이드 시스템 자체가 Parcelable을 사용하도록 최적화되어 있습니다.
  4. 타입 안정성:

    • Parcelize는 컴파일 타임에 코드를 생성하므로, 타입 관련 오류를 컴파일 시점에 잡을 수 있습니다.
    • Serializable은 런타임에 타입을 확인하므로 타입 관련 오류가 런타임에 발생할 수 있습니다.
  5. 버전 관리:

    • Parcelable은 명시적인 버전 관리 메커니즘을 제공하여 데이터 구조 변경 시 호환성을 유지하기 쉽습니다.
    • Serializable의 버전 관리는 더 복잡하고 오류가 발생하기 쉽습니다.

성능 차이의 구체적인 예:

  1. 직렬화/역직렬화 속도:

    • Parcelable은 Serializable보다 약 10배 정도 빠릅니다.
    • 대규모 데이터셋이나 복잡한 객체 그래프에서 이 차이는 더욱 두드러집니다.
  2. 메모리 사용:

    • Parcelable은 Serializable에 비해 최대 60% 적은 메모리를 사용할 수 있습니다.
    • 이는 특히 메모리가 제한된 모바일 장치에서 중요한 이점입니다.
  3. 가비지 컬렉션 부하:

    • Serializable은 더 많은 임시 객체를 생성하여 GC 실행 빈도를 증가시킵니다.
    • 이는 앱의 전반적인 성능과 반응성에 영향을 줄 수 있습니다.

실제 사용 시 주의사항:

  • 작은 객체나 간단한 데이터 구조에서는 성능 차이가 크게 눈에 띄지 않을 수 있습니다.
  • 복잡한 객체 그래프나 대량의 데이터를 다룰 때 Parcelize의 이점이 더욱 명확해집니다.
  • Parcelize를 사용할 때도 너무 큰 객체를 한 번에 직렬화하는 것은 피해야 합니다. 필요한 데이터만 전달하는 것이 좋습니다.

결론:
Parcelize (Parcelable)는 안드로이드 플랫폼에 최적화된 직렬화 메커니즘을 제공하여 더 나은 성능을 달성합니다. 특히 안드로이드 컴포넌트 간의 데이터 전달, 프로세스 간 통신, 그리고 상태 저장 및 복원과 같은 안드로이드 특화 시나리오에서 Parcelize는 탁월한 선택입니다. 그러나 플랫폼 간 호환성이 필요한 경우나 외부 시스템과의 통신에서는 Serializable이나 다른 직렬화 메커니즘을 고려해야 할 수 있습니다.

LIST