본문 바로가기
개발

TIL: parcelable

by kks950115 2023. 12. 27.
728x90

액티비티 간에 데이터를 string, int, long 등 다양하게 넘겨줄 수 있지만 객체를 전해줘야할 수도 있다.

 그럴 때는 parcelable을 사용하여 준다.  비슷한 역할을 하는 serializable 도 있다.

 

성능을 비교하면

parcelable >>>  serializable 

 

parcelable이 훨씬 나중에 나왔기 때문에 더 최신의 기술이고 그만큼 성능 역시 좋다. 하지만  serializable을 쓴다고 한다. 

왜일까?

parcelable 은 추상메소드이므로 하나하나 다 오버라이드를 해줘야한다.

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

class MyParcelableObject(val name: String, val age: Int) : Parcelable {

    // 생성자
    constructor(parcel: Parcel) : this(
        parcel.readString() ?: "",
        parcel.readInt()
    )

    // 객체를 Parcel로 쓰는 메서드
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    // 객체를 생성하는 Creator
    companion object CREATOR : Parcelable.Creator<MyParcelableObject> {
        override fun createFromParcel(parcel: Parcel): MyParcelableObject {
            return MyParcelableObject(parcel)
        }

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

    // 필요한 경우 추가적인 설정이나 메서드를 구현할 수 있음

    override fun describeContents(): Int {
        return 0
    }
}

 

이름과 나이를 옮길 뿐인데 저 코드를 써야한다는 것이다. 엄청 많기 때문에 . serializable을 쓴다고 한다.

 

하지만 parcelable 어노테이션을 사용하면 저 많은 코드를 다 쓸 필요가 없다.

@Parcelize
data class User(val name: String, val age: Int) : Parcelable  // 긴 코드를 쓸 필요없이 이거면 끝

// 데이터 전달
val user = User("John Doe", 30)
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("EXTRA_USER", user)
}
startActivity(intent)

// 데이터 수신
val receivedUser = intent.getParcelableExtra<User>("EXTRA_USER")

 

 

위처럼 엄청나게 간결해진다. 하지만 무작정 parcelable 어노테이션을 갖다 붙인다고 되진 않는다. 

 

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-parcelize")   // 이걸 붙여줘야함
}

 

 플러그인에 써놓고 씽크나우를 클릭해줘야  적용이 된다. 

728x90
반응형

댓글