Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 Parcelable vs Serializable: 차이점과 사용법 총정리

안드로이드 앱을 개발하다 보면 객체를 액티비티 간에 전달해야 하는 상황이 자주 발생합니다. 이때 사용할 수 있는 대표적인 방법이 바로 SerializableParcelable입니다. 두 방식 모두 객체를 전송 가능한 형태로 변환한다는 공통점이 있지만, 구현 난이도와 성능 면에서 뚜렷한 차이를 보입니다. 이 글에서는 두 인터페이스의 특징과 차이점을 예제 코드와 함께 자세히 살펴보겠습니다.

Serializable이란?

Serializable은 자바에서 기본으로 제공하는 마커 인터페이스(Marker Interface), 즉 구현해야 할 메서드가 하나도 없는 빈 인터페이스입니다. 클래스에 Serializable만 implements 하면 자바가 내부적으로 객체를 바이트 스트림(byte stream)으로 변환해 주며, 이를 통해 액티비티 간에 데이터를 손쉽게 전달할 수 있습니다.

Serializable의 가장 큰 장점은 구현이 매우 간단하다는 점입니다. 별도의 코드 작성 없이 인터페이스만 상속하면 되기 때문에 개발 시간을 크게 줄일 수 있습니다. 다만 리플렉션(reflection) 기반으로 동작하기 때문에 처리 과정에서 많은 임시 객체가 생성되며, 그 결과 Parcelable에 비해 속도가 느리다는 단점이 있습니다.

Serializable 구현 예제

import java.io.Serializable;

class serializableObject implements Serializable {
    String name;

    public serializableObject(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

위 예제처럼 단 한 줄의 implements 선언만으로 직렬화가 가능합니다. 이처럼 간편한 사용법 덕분에 소량의 데이터를 전달하거나 빠른 프로토타이핑이 필요할 때 유용하게 활용됩니다.

Parcelable이란?

Parcelable은 안드로이드 플랫폼 전용 인터페이스로, Serializable보다 훨씬 빠른 성능을 제공합니다. 마찬가지로 객체를 바이트 스트림으로 변환해 액티비티 간에 데이터를 전달하지만, 안드로이드 OS에 최적화되어 있어 직렬화·역직렬화 과정이 효율적입니다.

특히 Parcelable은 데이터 전달 과정에서 불필요한 임시 객체를 거의 생성하지 않기 때문에 메모리 사용 측면에서도 유리합니다. 대신 직접 마샬링(marshalling) 코드를 작성해야 하므로, 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을 구현하려면 writeToParcel()로 객체를 Parcel에 기록하고, CREATOR 객체를 통해 Parcel로부터 객체를 복원하는 과정을 직접 작성해야 합니다. 번거로워 보일 수 있지만, 최근에는 안드로이드 스튜디오의 자동 생성 기능이나 @Parcelize 어노테이션(Kotlin)을 활용하면 이러한 boilerplate 코드를 크게 줄일 수 있습니다.

Serializable vs Parcelable 비교 정리

구분SerializableParcelable
플랫폼자바 표준안드로이드 전용
구현 난이도매우 간단상대적으로 복잡
속도느림 (리플렉션 기반)빠름 (최적화된 처리)
임시 객체 생성많음거의 없음
권장 용도소량 데이터, 간단한 저장액티비티/프래그먼트 간 대용량 데이터 전달

결론

정리하자면, 간편함이 우선이라면 Serializable, 성능이 중요하다면 Parcelable을 선택하는 것이 좋습니다. 안드로이드에서 액티비티나 프래그먼트 간에 객체를 자주, 그리고 많이 전달해야 하는 경우에는 Parcelable이 GC 부담을 줄이고 실행 속도를 개선하는 데 확실히 유리합니다. 반대로 설정 값 정도의 가벼운 데이터를 가끔 전달하는 수준이라면 Serializable의 편리함만으로도 충분합니다. 프로젝트의 요구 사항과 데이터 규모를 고려해 적절한 방식을 선택하시기 바랍니다.