안드로이드를 개발하다보면 다른 액티비티로 데이터를 전달할때
그 데이터가 복잡한 클래스의 객체라면 Serializable 또는 Parcelable 를 사용하여 직렬화 하여 인텐트에 추가해야한다.
그럼 직렬화는 뭘까?
직렬화는
1. 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 내에 존재하는 정보는 즉 객체를 말한다.
2. JVM 의 메모리에 상주 되어있는 객체 데이터를 바이트 형태로 나타내는 기술
역직렬화 라는 개념도 있는데 말그대로 위의 내용의 반대라고 생각하면 된다.
Serializable 부터 뭔지 알아보자.
Serializable 는 Java 에서 제공하는 interface다 사용하기도 쉽고 직렬화 또한 잘된다.
그러나!
사용하기 쉬운 대신 시스템적인 리소스가 많이 든다. 물론 상대적으로
이유는 정확하게 모르겠으나 찾아본 결과
1. Serializable 는 내부에서 Reflection 을 사용해서 직렬화를 처리한다.
2. Reflection 은 프로세스 동작 중에 사용되며 처리 과정중에 많은 추가 객체를 생성하고 이 많은 객체들이
가비지 컬렉터의 타겟이 되며 가비지 컬렉터의 과도한 동작으로 인해서 성능 저하가 발생한다.
Reflection 에 대해서는 추후에 더 자세하게 따로 포스팅하도록 하겠다.
그럼 이번엔 Parcelable 에 대해서 알아보자.
Parcelable 은 직렬화를 위해 Java가 아닌 Android SDK 에서 제공하는 interface 다.
기존에 있던걸 개선하기 위해 새로 나온것인게 분명하다.
Parcelable 은 성능저하의 주범인 Reflection 을 사용하지 않도록 만들어졌다,
Serializable 과 달리 직렬화 처리를 사용자가 명시적으로 작성한다. 그래서 Parcelable 가 필요가 없다.
그래서 비교적 성능이 좋은 편인데 단점은 사용하기 어렵고 클래스가 복잡해지면 유지 보수가 어려워진다.
어느게 더 좋다에 대해서는 논란되는 말이 많은데
성능을 좋게 만드는게 우선이다! vs 빠르게 만드는거보다 내가 프로그램을 잘 이해해서 올바른 결과를 만드는게 맞다!
로 갈리는데 이건 상황에 따라 선택하면 될 일인거 같다.
'Android' 카테고리의 다른 글
ListView(리스트뷰) 자동 높이, 크기 조절 (0) | 2021.03.29 |
---|---|
MVVM 패턴 설명 - 2(view Model) (0) | 2021.03.27 |
MVVM 패턴 - 설명(1) (View) (0) | 2021.02.11 |
안드로이드 하드웨어 모듈과 TCP/IP 소켓 통신 (0) | 2021.01.28 |
안드로이드 DI 라이브러리 Koin 에 대해 (0) | 2021.01.24 |
안드로이드 MVVM 패턴 - 개요 (0) | 2021.01.24 |
마법같은 애니메이션 Lottie 에 대해서 (0) | 2021.01.19 |
코틀린 retrofit2 공부 (0) | 2020.11.16 |