[Kotlin/코틀린] @Parcelize / Parcelable을 사용한 직렬화와 역직렬화

반응형
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