-
Serializable, Parcelable (Intent) 그리고 Parcelize안드로이드 학습/Android 기술면접 대비 2024. 8. 8. 17:20
차례: 1. 직렬화와 역직렬화란 2. Serializable, Parcelable 이란?
안드로이드에서 data를 다른 컴포넌트로 넘길때 Intent를 사용한다.
예를 들어, Activity 에서 Activity 혹은 Activity에서 Service등 다른 컴포넌트로 데이터를 넘길때 Intent 안에 구성되어 있는 Bundle에 넣고 보내준다. (Intent & Bundle 기초내용)
하지만 객체는 직렬화 코드 추가 없이 Intent로 다른 컴포넌트에 전달이 불가능하다.
Intent로 전달 가능한 타입
더보기- 기본 데이터 타입 (int, double, boolean 등등)
- String
- ArrayList 등등 (안에 이미 Serializable이 추가되어 있다)
객체를 보내려면 직렬화 코드가 추가되어야 한는데 안드로이드에서는 2가지 방식이 있다. Serializable, Parcelable이다.
Serializable 과 Parcelable 둘다 객체를 직렬화 시켜주는 방법인데 도대체 직렬화가 뭔지부터 알아봐야겠다.
직렬화와 역직렬화란?
직렬화란?
- 직렬화는 메모리 내에 존재하는 정보를 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 내에 존재하는 정보는 즉 객체를 말한다.
- JVM(Java Virtual Machine)의 메모리에 상주 되어있는 객체 데이터를 바이트 형태로 변환하는 기술
즉 객체(Object)를 쉽게 전송하기 위해 byte 코드로 전송하는 것이다. (Convert from object to byte code)
역직렬화란?
- byte로 변환된 Data를 원래대로 Object나 Data로 변환하는 기술을 역직렬화라고 한다.
직렬화 & 역직렬화 사용 이유?
안드로이드 앱의 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버 등)는 동일한 프로세스에서 실행될 수도 있고, 필요에 따라 다른 프로세스에서 실행될 수도 있습니다. 각 프로세스는 독립적인 메모리 공간을 가지며, 한 프로세스의 메모리에 있는 객체를 다른 프로세스가 직접 접근할 수 없습니다. 따라서 한 프로세스에서 다른 프로세스로 객체를 전달하려면, 이 객체를 바이트 스트림 형태로 변환하여 전송해야 합니다. 직렬화는 이 변환 작업을 수행하는 방법입니다.
- 컴포넌트별 다른 프로세스 실행가능
- 프로세스끼리 독립적인 메모리 공간, 다른 프로세스 직접 접근 불가능
- 그래서 객체를 바이트 스트림 형태로 변환 그리고 전송
Serializable, Parcelable 이란?
Serializable
- Serializable은 Android SDK가 아닌 표준 Java의 인터페이스이다.
- Serializable은 해당 클래스가 직렬화 대상이라고 알려주기만 할뿐 어떠한 메소드도 가지지 않는 단순한 마커 인터페이스이므로 매우 쉽게 사용할 수 있다.
- Serializable 은 내부에서 Reflection 을 사용하여 직렬화를 처리
import java.io.Serializable; public class MyObject implements Serializable { // 멤버 변수 및 메서드 정의 }
원하는 class에 Serializable을 추가하면 간단하게 사용이 가능하다.
Parcelable
- Parcelable은 직렬화를 위한 또 다른 인터페이스이다.
- Serializable과는 달리 표준 Java가 아닌 Android SDK의 인터페이스이다.
- 사용자가 명시적으로 작성하기 때문에 Parcelabledms Reflection을 사용 안함.
import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { private String name; private int age; // 생성자 public Person(String name, int age) { this.name = name; this.age = age; } // Parcelable 인터페이스의 writeToParcel 메서드 오버라이드 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } // Parcelable.Creator 구현 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { @Override public Person createFromParcel(Parcel source) { return new Person(source); } @Override public Person[] newArray(int size) { return new Person[size]; } }; // Parcel에서 데이터를 읽어와 객체 생성하는 생성자 private Person(Parcel in) { name = in.readString(); age = in.readInt(); } // 나머지 메서드들 생략... }
Parcelable은 Serializable보다 빠르다는 장점이 있다고 한다. 하지만 Serializable에서는 구현할 필요 없는 필수 메서드들을 구현해야한다.
Parcelable과 Serializable의 차이점
Parcelable과 Serializable은 객체를 직렬화하여 전달하기 위한 방법이지만, 내부적으로 다음과 같은 차이점이 있습니다.
- 속도
- Parcelable은 Java의 Serializable보다 빠릅니다.
- Parcelable은 안드로이드 OS에서 직접 처리하기 때문에 직렬화와 역직렬화 시간이 적습니다.
- Serializable은 Java의 Reflection을 사용하기 때문에 직렬화와 역직렬화 시간이 상대적으로 느립니다.
- 크기
- Parcelable은 Java의 Serializable보다 객체를 직렬화할 때 생성되는 데이터 크기가 작습니다.
- Parcelable은 객체의 멤버 변수들을 Parcel에 쓰기 때문에 필요한 데이터만 쓰게 됩니다.
- Serializable은 객체의 모든 데이터를 직렬화하기 때문에 불필요한 데이터까지 모두 쓰게 됩니다.
- 안정성
- Parcelable은 Java의 Serializable보다 안정성이 높습니다.
- Parcelable은 직렬화와 역직렬화에 대한 오류 검사를 수행하기 때문입니다.
Serializable이 시스템 비용을 발생시키고 Parcelizable은 구현 및 유지 보수 비용이 든다고 한다.
뭐가 더 좋다라기보단 현재 회사의 인적 구성이나 주어진 개발 기간 등등을 고려해서 어떤게 더 서비스에 부합할까의 문제같다.
이미지 출처 : http://www.developerphil.com/parcelable-vs-serializable/
-------------------------------------------------------- 추가 학습 내용 --------------------------------------------------------
Parcelize
Parcelize는 Serializable의 간결성을 가지고 Parcelable을 생성하기 위해 생겨났다.
Parcelable을 자동으로 구현해준다.
추가 방법 :
plugins { .. id 'kotlin-parcelize' }
import kotlinx.parcelize @Parcelize class Test(val test1: String, val test2: Int): Parcelable
'안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글
안드로이드 Context (0) 2024.08.22 Handler와 Looper (0) 2024.08.20 안드로이드 비동기 처리 2-1 (RxJava & RxAndroid) (0) 2024.08.08 안드로이드 비동기 처리 1 (Thread, Runnable, Executor Service) (0) 2024.07.18 안드로이드 LiveData (0) 2024.02.06