본문 바로가기
Android

[Android/Kotlin] Kotlin에서 @Parcelize를 사용하여 객체 전달하기

by quessr 2024. 7. 25.

Android 애플리케이션 개발 시, Activity나 Fragment 간에 데이터를 전달해야 할 때가 많습니다. 이때 가장 많이 사용되는 방법 중 하나가 Parcelable 인터페이스를 구현하는 것입니다. Kotlin에서는 @Parcelize 어노테이션을 사용하여 이 과정을 더 쉽게 만들 수 있습니다. 이번 글에서는 @Parcelize를 사용하여 데이터를 전달하는 방법에 대해 알아보겠습니다.

1. @Parcelize 어노테이션 소개

@Parcelize 어노테이션은 Kotlin에서 Parcelable 인터페이스의 구현을 자동화해주는 기능입니다. 이를 통해 번거로운 Parcelable 구현 코드를 간단하게 처리할 수 있습니다.

예시 데이터 클래스

먼저, 데이터 클래스를 정의하고 @Parcelize 어노테이션을 추가합니다.

package com.example.finebyme.domain.entity

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Photo(
    var id: String,
    var title: String,
    val description: String?,
    val fullUrl: String,
    val thumbUrl: String
) : Parcelable

2. Photo 객체를 전달하는 Utils 함수 만들기

데이터 클래스를 정의한 후, 객체를 Activity로 전달하기 위한 Intent를 생성하는 Utils 함수를 만듭니다.

package com.example.finebyme.presentation.utils

import android.content.Context
import android.content.Intent
import com.example.finebyme.domain.entity.Photo
import com.example.finebyme.presentation.photoDetail.PhotoDetailActivity

object IntentUtils {
    private const val ARG_PHOTO = "photo"

    fun newPhotoDetail(context: Context, photo: Photo): Intent {
        return Intent(context, PhotoDetailActivity::class.java).apply {
            putExtra(ARG_PHOTO, photo)
        }
    }
}

3. PhotoListFragment에서 Photo 객체 전달하기

PhotoListFragment에서 Photo 객체를 PhotoDetailActivity로 전달하는 코드를 작성합니다.

package com.example.finebyme.presentation.photoList

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.example.finebyme.domain.entity.Photo
import com.example.finebyme.domain.interaction.OnPhotoClickListener
import com.example.finebyme.presentation.utils.IntentUtils.newPhotoDetail

class PhotoListFragment : Fragment() {

    private val photoListViewModel: PhotoListViewModel by activityViewModels()

    private fun setupRecyclerView() {
        photoAdapter = PhotoAdapter(photoListViewModel, object : OnPhotoClickListener {
            override fun onPhotoClick(photo: Photo) {
                val intent = newPhotoDetail(requireContext(), photo)
                startActivity(intent)
            }
        })
        // RecyclerView 설정 코드
    }
}

4. PhotoDetailActivity에서 Photo 객체 받기

PhotoDetailActivity에서 Photo 객체를 받아 처리하는 코드를 작성합니다.

package com.example.finebyme.presentation.photoDetail

import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.example.finebyme.domain.entity.Photo

class PhotoDetailActivity : AppCompatActivity() {

    companion object {
        private const val ARG_PHOTO = "photo"
    }

    private var photo: Photo? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        photo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            intent.getParcelableExtra(ARG_PHOTO, Photo::class.java)
        } else {
            @Suppress("DEPRECATION")
            intent.getParcelableExtra(ARG_PHOTO)
        }

        photo?.let {
            // photo 객체를 사용하여 UI를 설정하거나 다른 작업 수행
        } ?: finish()
    }
}

5. 마무리

이제 @Parcelize를 사용하여 Photo 객체를 Fragment에서 Activity로 안전하게 전달할 수 있습니다. @Parcelize 어노테이션을 사용하면 데이터 클래스를 Parcelable로 만들 때의 번거로움을 줄일 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다. 이 방법을 통해 Android 애플리케이션에서 데이터 전달을 더 효율적으로 할 수 있습니다.