본문 바로가기

개발 노트/Kotlin

[Android / Kotlin] Intent로 Class 값 넘기기 (Serializable, Parcelable, Parcelize)

일반적으로 intent를 사용해서 넘겨주면 데이터를 하나하나씩 넘겨줘야되기때문에 코드가 길어지고 효율성도 안좋다

 

그래서 보통 데이터를 클래스형태로 만들어서, 그 클래스를 한방에 넘겨주는 직렬화 방식을 사용한다!

코틀린에서 직렬화를 통해 값을 전달하는 방법은 Serializable, Parcelable, Parcelize 이렇게 3가지가 있다

 

 

# Serializable

data class Product(
    val id : Int,         
    @DrawableRes
    val image : Int,   
    val name : String,     
    val area : String,        
    val price : Int,          
    val comment : Int,          
    var favorate : Int,        
    val description : String,   
    val seller : String,         
    var isLike : Boolean = false   
) : Serializable

Serializable은 자바의 표준 인터페이스로, 이렇게 데이터 클래스의 뒤에 : Serializable만 달아주면 되기 때문에 굉장히 간편하다는 장점이 있다

그치만 속도가 굉장히 느린 단점이 있어, 프로젝트 내에서 Serializable을 많이 사용하면 할수록 성능이 저하되는 문제가 있다

 

 

# Parcelable

data class Product(
    val id : Int,         
    @DrawableRes
    val image : Int,   
    val name : String,     
    val area : String,        
    val price : Int,          
    val comment : Int,          
    var favorate : Int,        
    val description : String,   
    val seller : String,         
    
    var isLike : Boolean = false   
) : Parcelable {

 

Parcelable은 자바 기반이 아닌 Android SDK의 인터페이스로, Serialize보다 빠르며 안드로이드에서 사용하길 권장한다

그치만, 필요한 코드를 모두 개발자가 구현해줘야 하기 때문에 간단한 값을 넘겨주는것치고는 너무 작성해야할 코드가 많고 보일러플레이트코드가 많이 생긴다는 문제가 있다

 

 

 

# Parcelize

이러한 문제들을 보완하기위해 나온것이 Parcelize인데,

Parcelize는 시간과 노력을 덜 들이고 손쉽게 데이터 클래스를 Parcelable하게 만들어 준다

Serializable의 간편성과 Parcelable의 성능을 모두 모아둔것이다!

그러니 Parcelize를 사용하도록하자

 

Parcelize를 사용하려면 먼저 gradle에 플러그인 추가를 해줘야한다

plugins {
	...
    id ("kotlin-parcelize")
}

build.gradle(app)

 

 

이제  데이터 클래스에 @Parcelize 어노테이션을 달아주고, 데이터 클래스 뒤에 :Parcelable 을 달아준다!

@Parcelize
data class Product(
    val id : Int,         
    @DrawableRes
    val image : Int,       
    val name : String,   
    val area : String,         
    val price : Int,        
    val comment : Int,      
    var favorate : Int,        
    val description : String,  
    val seller : String,         
    var isLike : Boolean = false        
) : Parcelable

데이터클래스

 

 

 

데이터를 전달하는 엑티비티에서는 putExtra로 product데이터 전체를 가져와서 넘겨준다


   private fun adpaterOnClick(product: Product) {
    
        val intent = Intent(this, DetailActivity()::class.java)
        
        // 데이터 전달 (product 전체를 전달)
        intent.putExtra("product", product)
        startActivity(intent)
    }

데이터 전달하는 엑티비티

 

 

데이터를 받아오는 엑티비티에서는 이런식으로 getParcelableExtra사용해서 보낸 데이터 받아와준뒤

해당하는 레이아웃에 데이터를 뿌려주면 끝이다

        val intent = getIntent()

//        val productItem = intent?.getParcelableExtra<Product>("product")
        val productItem = intent.getParcelableExtra("product") as? Product  //이렇게 쓸수도 있음!

        productItem?.let {
            with(binding) {
                Glide.with(this@DetailActivity).load(it.image).into(detailItemIv)
                detailSellerTv.text = it.seller
                detailAreaTv.text = it.area
                detailNameTv.text = it.name
                detailContentTv.text = it.description
                detailPriceTv.text = DecimalFormat("#,###").format(it.price) + "원"

데이터 받는 엑티비티

 

 

 

 

 

 

 

 

 

# 참고자료

https://yuuj.tistory.com/211

 

[Android][Kotlin] Intent로 Class 값 넘기기 (Parcelize, Serializable, Parcelable 차이)

액티비티간 Intent로 값 넘기기 (클래스) FirstActivity에서 SecondActivity로 값을 넘겨주고 싶을때 intent를 사용해서 전달이 가능한데, Int형이나 Array, String등의 자료형을 넘겨주려면 이 게시글을 참고하

yuuj.tistory.com

https://ducksever.tistory.com/31

 

[Kotlin] Parcelize 사용하여 intent에 data class 담아 전달하기

서버에서 받아 온 데이터를 다른 액티비티에 전달하고자 했습니다. 이 과정에서 intent에 data class를 담아 전달하기 위해 방법을 찾던 중 Parcelize에 대해 알게 되었고 이를 사용하여 구현해보았습

ducksever.tistory.com