안드로이드 개발에서 Intent 등을 통해 객체를 다른 컴포넌트로 전달하려면 객체를 직렬화해야 합니다. 이때 사용할 수 있는 대표적인 두 가지 방식이 Serializable과 Parcelable입니다. 이 글에서는 두 방식의 차이점과 각각의 구현 예제, 그리고 어떤 상황에서 무엇을 선택해야 하는지 살펴보겠습니다.
Serializable이란?
Serializable은 자바에서 제공하는 마커 인터페이스(marker interface)로, 구현해야 할 메서드가 전혀 없는 빈 인터페이스입니다. 이 인터페이스를 구현하면 자바의 직렬화 메커니즘이 자동으로 객체를 바이트 스트림(byte stream)으로 변환해 주며, 이를 통해 액티비티 간에 객체 데이터를 손쉽게 전달할 수 있습니다.
Serializable의 가장 큰 장점은 구현이 매우 간단하다는 점입니다. 클래스 선언부에 implements만 추가하면 별도의 코드 작성 없이 바로 사용할 수 있습니다. 다만 리플렉션(reflection) 기반으로 동작하기 때문에 처리 과정에서 많은 임시 객체가 생성되고, 그 결과 Parcelable에 비해 속도가 느리고 가비지 컬렉션(GC) 부담이 커진다는 단점이 있습니다.
아래는 Serializable의 간단한 구현 예제입니다.
import java.io.Serializable;
class serializableObject implements Serializable {
String name;
public serializableObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
}Parcelable이란?
Parcelable은 안드로이드 SDK에서 제공하는 인터페이스로, Serializable보다 훨씬 빠른 성능을 제공합니다. 객체를 바이트 스트림으로 변환해 두 액티비티(또는 컴포넌트) 간에 데이터를 전달한다는 점은 Serializable과 동일하지만, 내부적으로 최적화된 방식으로 동작합니다.
다만 writeToParcel(), CREATOR 등 구현해야 할 멤버가 많아 Serializable에 비해 코드 작성이 다소 복잡합니다. 대신 데이터 전달 과정에서 불필요한 임시 객체를 거의 생성하지 않기 때문에 메모리 효율이 뛰어나고 처리 속도가 빠릅니다.
아래는 Parcelable의 간단한 구현 예제입니다.
import android.os.Parcel;
import android.os.Parcelable;
class parcleObject implements Parcelable {
private String name;
protected parcleObject(Parcel in) {
this.name = in.readString();
}
public parcleObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static final Creator<parcleObject> CREATOR = new Creator<parcleObject>() {
@Override
public parcleObject createFromParcel(Parcel in) {
return new parcleObject(in);
}
@Override
public parcleObject[] newArray(int size) {
return new parcleObject[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
}
}정리: 어떤 것을 선택해야 할까?
두 방식의 주요 차이점을 항목별로 비교하면 다음과 같습니다.
- 성능: Parcelable이 Serializable보다 상당히 빠르며, 임시 객체 생성이 적어 메모리 효율도 우수합니다.
- 구현 난이도: Serializable은 implements 한 줄이면 끝나지만, Parcelable은 여러 메서드를 오버라이드해야 하므로 코드량이 많습니다.
- 사용 환경: Serializable은 순수 자바 환경에서도 사용할 수 있는 반면, Parcelable은 안드로이드 전용입니다.
- 권장 사항: 안드로이드에서 Intent로 객체를 전달할 때는 성능상의 이유로 Parcelable 사용이 권장됩니다. 코틀린이라면 @Parcelize 어노테이션(kotlinx.parcelize)을 활용해 보일러플레이트 코드를 크게 줄일 수 있습니다.