일반적으로 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://ducksever.tistory.com/31
'개발 노트 > Kotlin' 카테고리의 다른 글
[Android/Kotlin] 천단위로 콤마 표시하기 (DecimalFormat) (0) | 2024.04.12 |
---|---|
[Android/Kotlin] ImageView scaleType 속성 (0) | 2024.04.12 |
[Android/Kotlin] Fragment간 데이터통신(데이터전달) (0) | 2024.04.12 |
[Android / Kotlin] Recyclerview에 구분선 표시 (0) | 2024.04.11 |
[Android/Kotlin] 어댑터 콜백을 위한 Lambda 함수 전달 (0) | 2024.04.10 |