ABOUT ME

설명이 필요해?

Today
Yesterday
Total
  • 안드로이드에서 왜 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
Designed by Tistory.