[기술 면접 질문] Parcelable & Serializable

0

기술 면접 준비

목록 보기
11/19
post-thumbnail

[기술 면접 질문] Parcelable & Serializable

📝요약

Parcelable과 Serializable은 데이터를 직렬화하기 위한 인터페이스입니다. Serializable은 Java 표준 인터페이스로, 사용하기엔 간편하지만 내부적으로 Reflection을 사용하여 속도가 느린 단점이 있습니다. Parcelable은 Android SDK 인터페이스로, Serializable보다 속소가 빠르지만, 직렬화 방법을 개발자가 명시적으로 작성해야하는 단점이 있습니다.
추가로, 코틀린은 Parcelable 구현을 자동 생성하는 Parcelize 플러그인을 제공합니다.

📌참고자료

  • 액티비티/프래그먼트에 복잡한 데이터 클래스를 전달하기 위해 데이터들을 직렬화해서 전달해야 함
  • 안드로이드에서 직렬화 방법:
    • Serializable (Java 표준 인터페이스)
    • Parcelable (Android SDK 인터페이스)

Serializable

  • 사용 방법: Serializable 인터페이스 상속하면 끝
    • 해당 클래스가 직렬화 대상이라고 알려주기만 할 뿐 어떠한 메서드도 갖지 않는 마커 인터페이스(Marker Interface)
  • Serializable은 간편한 대신, 속도가 느리다
    • 자바의 Reflection 을 사용하기 때문
    • Reflection은 프로세스 동작 중 많은 추가 객체 생성 → GC 오버헤드 발생
data class Person(
    val username: String,
    val thumbnail: String
) : Serializable

Parcelable

  • Parcelable은 Reflection 을 사용하지 않도록 설계됨
  • Serializable과 달리, 직렬화 처리 방법을 개발자가 명시적으로 작성
  • 사용 방법: Parcelable 인터페이스 상속 후, 함수 오버라이딩
  • 데이터 클래스 파라미터 수가 증가할수록 Parcelable을 사용하기 위한 코드 늘어남
    -> 유지보수 어려워짐, 생성 리소스 증가
import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {

    private String firstName;
    private String lastName;
    private int age;


    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.firstName);
        dest.writeString(this.lastName);
        dest.writeInt(this.age);
    }

    protected Person(Parcel in) {
        this.firstName = in.readString();
        this.lastName = in.readString();
        this.age = in.readInt();
    }

    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];
        }
    };
}

Kotlin의 Parcelize

  • Parcelable 구현을 자동으로 생성해주는 kotlin-parcelize 플러그인
    • 구글과 Jetbrains가 협업하여 만든 플러그인
  • 사용 방법:
    • build.gradle에 plugin 추가
    • Parcelize 애노테이션 선언 후 Parcelable 인터페이스 상속하면 끝
  • 사용 시 주의할 점:
    • 모든 직렬화된 속성을 기본 생성자에서 선언해야
    • 클래스 본문에서 선언된 backing field가 있는 각 속성에 경고 표시됨!
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 

android { 
  ... androidExtensions { experimental = true } 
}
@Parcelize
data class User(
        val username: String,
        val thumbnail: String,
        val age: Int
) : Parcelable
profile
Be able to be vulnerable, in search of truth

0개의 댓글