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
반응형
'android' 카테고리의 다른 글
[Android] DI를 사용해보자 | Hilt (3) | 2024.09.05 |
---|---|
[Android] Clean Architecture 클린 아키텍처 (2) | 2024.09.01 |
[Android] 안드로이드를 한다면 꼭 알아야 하는 개념 | 동기, 비동기 (0) | 2024.08.25 |
API 서버 전송 실패 시 Firebase Crashlytics로 log 남기기 (0) | 2024.08.16 |
MVVM vs MVI (0) | 2024.08.11 |