본문 바로가기
android

[Android] Serializable VS Parcelable

by liz_devel 2024. 8. 28.

Serializable, Parcelable는 둘 다 직렬화를 위한 인터페이스이다.

둘 중 어느 것을 쓰는 게 나은지는 항상 화두에 오르는 주제이기 때문에 알아보려고 한다.


직렬화? 그게 뭔데.

화면 설계를 하다보면 값(value)만 전달하는 게 아니라 객체(Object)를 전달해야 하는 경우도 생깁니다.

이때, 이 객체를 전달하기 위하여 객체를 byte-stream으로 변경하는 것을 "직렬화"라고 합니다.

 


Serializable

  • 자바 기반의 직렬화 인터페이스
  • Reflection을 사용하여 직렬화 처리를 함
  • 마커 인터페이스(Marker Interface): 별도로 구현해야 하는 메서드가 없음

*리플렉션이란?

구체적인 클래스 타입을 알지 못해도 런타임 때 동적으로 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API다.

  • 런타임 때 동적으로 코드 조작할 수 있음 -> 자바 직렬화, 테스트 코드 작성 등에 사용됨
  • 런타임 시점에서 클래스의 메타데이터를 분석하고 객체의 속성이나 메소드를 동적으로 접근할 수 있게 해줌
  • 런타임에 클래스 정보를 얻을 수 있고 메소드 호출, 속성 변경이 가능함

단점

  • 성능 저하를 일으킬 수 있음
  • 안정성 저하시킬 수 있음 -> 개발자가 의도치 않은 방식으로 내부 구조에 접근할 수 있기 때문
  • 보안 문제에 취약함 -> 비공개 멤버 접근이 가능하기 때문

 

리플렉션은 남용하지 않는 게 좋다고 한다.

이유는 즉, 리플렉션은 내부 구현에 직접 접근하기 때문에 캡술화를 위반하고 이로 인해 예상치 못한 다른 문제가 생길 수 있기 때문이다.

 

Parcelable

  • 안드로이드 SDK 기반의 인터페이스
  • 사용자가 직접 직렬화 처리 방법을 명시하기 때문에 Reflection이 필요없음
  • 많은 보일러 플레이트를 만들게 됨 -> kotlin-parcelize 플러그인을 사용하면 Parcelable 구현을 자동으로 해주기 때문에 따로 구현하지 않아도 됨
  • Intent 전달 시 용이(아래와 같은 메소드를 제공하고 있음)
    • Intent#putExtra(String, Parcelable)
    • Intent#putParcelalbeArrayListExtra(String, ArrayList<out Parcelable>)

 

 

 

참고: https://jeongkyun-it.tistory.com/225

 

[Java] 리플렉션 (Reflection)이란 무엇일까? (개념/ 예시)

서론 이번 포스팅에서 다룰 내용은 '리플렉션'이다. 최근 "리플렉션이 무엇인가요?" 라는 질문을 받았는데, 제대로 된 답변을 못한 것 같다. C# 개발을 할 때 분명 사용은 해보았지만 개념적으로

jeongkyun-it.tistory.com

https://medium.com/jaesung-dev/android-%EC%A7%81%EB%A0%AC%ED%99%94%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94-18fd04f1c0ed

반응형