코딩하는 일용직 노동자

Parcelable을 사용해 데이타 객체 보내기 본문

안드로이드

Parcelable을 사용해 데이타 객체 보내기

bacass 2020. 6. 9. 14:36

안드로이드에서 A액티비티에서 B액티비티로 이동할때 데이타를 보내는 경우가 있습니다.
간단한 몇개의 변수는 putExtra로 쉽게 보내고 받을 수 있지만, 데이타 클래스 객체를 통째로 보낼경우도 있습니다.

이렇게 안드로이드에서 Intent로 데이타 클래스 객체를 보낼때 Serializable 과 Parcelable을 사용할 수 있습니다.
Serializable은 java에서 사용되던 것으로 사용방법은 쉽지만 제약도 많습니다.
Serializable로 데이타 클래스 객체를 보낼때는 해당 데이타 클래스에서 사용하는 다른 모든 클래스 객체들도 Serializable을 implements된 상태여야 합니다.

안드로이드에는 새로운 직렬화 방법으로 Parcelable이 있습니다.

parcel은 소포 꾸러미라는 뜻이다. 안드로이드에선 데이타를 포장해서 보낸다는 의미.

Parcelable은 원하는 객체들만 직렬화를 시켜서 보낼수 있기 때문에 Serializable보다 제약이 덜하고 훨씬 더 빠른 처리속도를 보인다고 합니다.

Serializable vs Parcelable 의 속도차이. 그러나 속도 측정 자체가 잘못되었고 속도에 차이가 거의 없다는 의견도 있다.

하지만 Parcelable을 이용하기 위해선 구현해줘야 하는 함수들이 많습니다.

class MyData {
    var count: Int = 0
    var age: Int = 0
    var name: String = ""
    var addr: String = ""
}


/**
 * Serializable은 이렇게 구현해주면 끝이다.
 */
class MyData: Serializable {
    var count: Int = 0
    var age: Int = 0
    var name: String = ""
    var addr: String = ""
}

parcelable 을 쉽게 구현하는걸 도와줄 플러그인을 설치해보자.

구현해줘야하는 함수가 많지만 크게 걱정할 필요는 없습니다.
Android Studio 가 알아서 해주니까요.
빨간전구 아이콘이 보이면 클릭해서 Add Parcel Implements를 선택해주면 됩니다.

Add Parcelable Implementation 을 선택하면 편리하다.

import android.os.Parcel
import android.os.Parcelable

/**
 * Parcelable은 훨씬 더 많은 함수들을 구현해줘야 한다.
 */
class MyData() : Parcelable {
    var count: Int = 0
    var age: Int = 0
    var name: String = ""
    var addr: String = ""

    constructor(parcel: Parcel) : this() {
        count = parcel.readInt()
        age = parcel.readInt()
        name = parcel.readString().toString()
        addr = parcel.readString().toString()
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(count)
        parcel.writeInt(age)
        parcel.writeString(name)
        parcel.writeString(addr)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

Parcelable에서 구현해줘야하는 생성자, writeToParcel, CREATOR 등이 자동으로 생성됩니다.

이제 Parcelable을 이용해 데이타 객체를 전달해보겠습니다.
보낼때는 putExtra에 담아서 보내면됩니다.

val myData = MyData().apply {
  count = 12
  age = 33
  name = "홍길동"
  addr = "서울특별시 천호대로 114길 123"
}

val intent = Intent(this, SubActivity::class.java)
intent.putExtra("parcel", myData)
startActivity(intent)

받을때는 getParcelableExtra<클래스타입>을 이용해 Parcelable 객체를 전달 받을 수 있습니다. 

val myData = intent?.getParcelableExtra<MyData>("parcel")

Log.d("Parcel", "myData.count : ${myData?.count}")
Log.d("Parcel", "myData.age : ${myData?.age}")
Log.d("Parcel", "myData.name : ${myData?.name}")
Log.d("Parcel", "myData.addr : ${myData?.addr}")

parcelable로 만든 데이타를 전달받았다.