반응형
SMALL
안드로이드 개발에서 데이터 객체를 인텐트나 번들로 전달할 때, 데이터 객체를 직렬화 해야하는 경우가 많다. 스프링과 같은 프레임워크에서도 데이터 객체를 사용할 때 직렬화하는 경우가 많다.
어쨋든, 코틀린에서는 @Parcelize를 사용하면 효율적으로 데이터를 직렬화와 역직렬화를 할 수 있다.
Parcelable이란?
Parcelable은 안드로이드에서 객체를 직렬화하는 데 사용되는 인터페이스이다.
객체의 데이터를 Parcel이라는 형식으로 변환하여 다른 컴포넌트 간에 전달할 수 있도록 한다. 안드로이드에서는 기본적으로 제공하는 Serializable과 달리 Parcelable은 보다 빠르고 효율적으로 데이터를 직렬화할 수 있다.
그래서, 왜 사용하는데?
성능이 뛰어나며, 메모리 효율성 측면에서도 최적화되어 있어 안드로이드에서 객체 전달 시 권장한다고 한다.
인텐트나 번들을 통해 데이터 객체를 전달할 때는 Parcelable로 데이터를 직렬화하여 전달하고, 수신 측에서는 역직렬화하여 객체 복원한다.
사용 예시: 레시피모델
1. 레시피 모델 정의 및 Parcelable 구현
데이터 클래스를 먼저 정의하고, Parcelable 인터페이스를 구현해야 한다. @Parcelize 어노테이션을 사용하면 구현할 수 있다.
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
// @Parcelize 어노테이션을 통해 Parcelable 구현을 자동화
@Parcelize
data class Recipe(
val name: String, // 레시피 이름
val description: String, // 레시피 설명
val ingredients: List<String> // 재료 리스트
) : Parcelable
- @Parcelize 어노테이션: @Parcelize 어노테이션을 사용하면 Parcelable 인터페이스를 자동으로 구현할 수 있어, writeToParcel과 createFromParcel 메서드를 직접 작성할 필요가 없다.
- 필드 정의: name, description, ingredients 필드를 포함한 Recipe 데이터 클래스를 정의
- Parcelable 구현: Parcelable 인터페이스를 통해 레시피 객체를 직렬화 및 역직렬화할 수 있다.
2. 레시피 객체 전달하기 - 직렬화 과정
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 레시피 객체 생성
val recipe = Recipe(
name = "Pasta",
description = "Delicious pasta with tomato sauce",
ingredients = listOf("Pasta", "Tomato", "Olive Oil", "Garlic")
)
// 인텐트를 통해 SecondActivity로 레시피 객체 전달
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("recipe", recipe) // 직렬화된 객체 추가
startActivity(intent)
}
}
- Intent의 putExtra를 사용하여 recipe 객체를 인텐트에 추가
- Recipe 객체가 Parcelable을 구현했기 때문에 인텐트에 객체를 직접 넣을 수 있다.
3. 레시피 객체 받기 - 역직렬화
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.widget.TextView
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
// 인텐트로부터 직렬화된 레시피 객체를 역직렬화하여 가져오기
val recipe = intent.getParcelableExtra<Recipe>("recipe")
// 레시피 정보 표시
val nameTextView: TextView = findViewById(R.id.nameTextView)
val descriptionTextView: TextView = findViewById(R.id.descriptionTextView)
val ingredientsTextView: TextView = findViewById(R.id.ingredientsTextView)
// 가져온 객체가 null이 아닌 경우 UI에 설정
recipe?.let {
nameTextView.text = it.name
descriptionTextView.text = it.description
ingredientsTextView.text = it.ingredients.joinToString(", ")
}
}
}
- intent.getParcelableExtra<Recipe>("recipe")를 사용하여 인텐트로부터 전달된 Recipe 객체를 역직렬화하여 가져온다.
- 가져온 recipe 객체의 속성을 텍스트 뷰에 표시하여 UI에 레시피 정보를 보여준다.
주의사항
- @Parcelize 어노테이션: @Parcelize 어노테이션을 사용하려면 kotlin-parcelize 플러그인을 추가해야 한다. 이 플러그인을 사용하지 않으면 writeToParcel과 createFromParcel 메서드를 직접 구현이 필요함
- 필드 타입: 모든 필드가 Parcelable로 직렬화 가능해야 한다. 만약 그렇지 않다면, 해당 필드를 다른 방식으로 직렬화하거나 제거하는 과정이 필요함
- 성능 고려: Parcelable은 Serializable보다 빠르지만, 지나치게 많은 데이터를 직렬화할 경우 성능에 영향을 줄 수 있다. 필요한 최소한의 데이터만 직렬화하는 것이 좋다.
반응형
LIST
'Android > Kotlin' 카테고리의 다른 글
[Kotlin/코틀린] String과 Int 변환 - String to Int, Int to String 변환 방법 (0) | 2024.11.07 |
---|---|
[Kotlin/코틀린] MVVM 패턴이란? - MVVM 패턴과 Counter 앱 (5) | 2024.11.03 |
[Kotlin/코틀린] 인터페이스와 다중 상속이란? (1) | 2024.11.02 |
[Kotlin/코틀린] override와 super 개념 (1) | 2024.11.02 |