• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

[Android] Serializable과 Parcelable
Android

[Android] Serializable과 Parcelable

2021. 8. 5. 16:25

Serializable?

Serializable은 표준 Java 인터페이스로 이 인터페이스를 구현한 클래스의 객체는 한 액티비티에서 다른 액티비티로 이동할 수 있다.

Serializable은 해당 클래스가 직렬화 대상이라고 알려주기만 할뿐 어떤 메소드도 가지지 않는 단순한 '마커 인터페이스' 이기 때문에 사용

자들이 쉽게 접근할 수 있다. 하지만 그만큼 시스템 비용이 비싸다.

Serializable은 내부에서 Reflection이 일어나며 직렬화를 처리하는데, 이 Reflection은 프로세스 동작 중에 사용되며 처리 과정 중에 많

은 추가 객체를 생성한다. 생성된 많은 추가 객체들은 가비지 컬렉터를 낭비시키고 이로 인해 성능 저하를 일으킨다.

class Person : Serializable{

        private var name: String ?= null
        private var age: String ?= null
}

Parcelable?

Parcelable은 직렬화를 위한 또 다른 인터페이스로 Serializable과는 달리 Android SDK의 인터페이스다.

Parcelable은 Reflection을 사용하지 않고 직렬화 처리 방법을 사용자가 직접 구현을 작성해야 하므로 자동적인 처리를 위한 Reflection이 필요없다.

class Person() : Parcelable{

    private var name: String ?= null
    private var age: String ?= null

    constructor(parcel: Parcel) : this() {
        name = parcel.readString()
        age = parcel.readString()
    }

    override fun describeContents(): Int {

        return 0
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(this.name)
        dest?.writeString(this.age)
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

하지만 Parcelable의 비용이 없다는 것은 아니다.

마커 인터페이스인 Serializable과는 다르게 Parcelable은 필수 구현 메소드들을 포함하기 때문에 클래스에 보일러 플레이트 코드가

추가되기 때문이다.

이는 클래스의 가독성을 해치고 새로운 기능을 추가하는데 어렵게 만든다. 또한 코드의 추가로 비대해 질 경우 유지보수가 매우 힘들어진다.

Serializable vs Parcelable

Parcelable은 위의 설명과 같이 하나의 클래스 객체 만을 위한 특별한 사용자 정의 코드를 작성해야 하므로

Serializable과는 달리 쓰레기 객체를 생성할 이유가 없고 그 결과 성능이 더 좋긴하다.

하지만 Serializable에서 자동으로 처리되는 직렬화 프로세스도 사용자가 구현한 특정 메소드로 대체할수 있다.

사용자가 구현한 writeObject()와 readObject()메소드와 함께 Serializable 접근 방식을 사용하는 것이다.

    @Throws(IOException::class)
    private fun writeObject(out: ObjectOutputStream) {
    }

    @Throws(IOException::class, ClassNotFoundException::class)
    private fun readObject(`in`: ObjectInputStream) {
    }

    @Throws(ObjectStreamException::class)
    private fun readObjectNoData() {
    }

마치 Parcelable의 사용법 처럼 Serializable의 writeObject()와 readObject() 메소드에 해당 클래스에 맞는

처리 로직을 포함시킬 수 있다. 위 로직이 제대로 수행된다면 더 이상 쓰레기 객체가 생성되지 않는다.

이렇게 특정 클래스를 처리 한 경우 Serializable이 Parcelable보다 쓰기는 3배, 읽기는 1.6배 정도 빨라진다고 한다.

 

'Android' 카테고리의 다른 글

[Android] RecyclerView DiffUtil  (0) 2021.12.01
[Android] Context  (0) 2021.09.01
[Android] Mac M1 Room 라이브러리 에러  (0) 2021.07.30
[안드로이드] Android Architecture Components(AAC)의 LiveData  (0) 2021.03.18
[안드로이드] Android Architecture Components(AAC)의 ViewModel  (0) 2021.03.18
    'Android' 카테고리의 다른 글
    • [Android] RecyclerView DiffUtil
    • [Android] Context
    • [Android] Mac M1 Room 라이브러리 에러
    • [안드로이드] Android Architecture Components(AAC)의 LiveData
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바