관리 메뉴

나만을 위한 블로그

[Android] Parcelize란? 본문

Android

[Android] Parcelize란?

참깨빵위에참깨빵 2023. 6. 21. 23:38
728x90
반응형

앱을 개발하다 보면 다른 화면으로 넘어갈 때 데이터를 전달해야 할 수 있다. 앱에서 데이터를 전달해야 한다면 인텐트에 putExtra()로 넣어서 이동할 화면으로 보내고, 해당 화면에서 받아서 사용하는 게 가장 기초적이면서 일반적인 방법이라고 할 수 있다.

이 때 보내야 하는 데이터가 객체 형태라면 어떻게 해야 할까? data class를 보내야 하는 경우 그대로 putExtra()를 사용하면 컴파일 에러가 발생한다. 에러 내용은 "None of the following functions can be called with the arguments supplied."다.

 

data class Test(
    val name: String,
    val age: Int
)
Intent(this, TargetActivity::class.java).apply {
    putExtra("object", Test("name", 10))
}

 

이 때 @Parcelize 어노테이션과 Parcelable 인터페이스를 붙이면 컴파일 에러가 사라진다.

 

@Parcelize
data class Test(
    val name: String,
    val age: Int
): Parcelable

 

2가지가 뭐길래 이게 가능해지는 것인가?

 

Parcelable은 안드로이드의 IPC(Inter-Process Communication)를 위해 만들어진 인터페이스다. IPC는 같은 시스템에서 실행되는 서로 다른 프로세스 간 데이터를 전송하는 매커니즘이다. 안드로이드에선 이걸로 다른 앱 또는 앱 안의 컴포넌트 간에 데이터를 전달해서 통신할 수 있게 된다. 이 인터페이스를 사용하면 객체를 이동시키기 위한 방법인 마샬링(또는 직렬화)를 정의할 수 있게 된다. 그러나 마샬링 정의 과정이 복잡하기 때문에 에러가 발생할 확률이 올라가고, 코드가 길어지기 때문에 가독성도 떨어질 수 있다.

 

@Parcelize는 코틀린에서 제공하는 어노테이션으로 Parcelable 인터페이스 구현을 간소화한다. 컴파일러는 이 어노테이션이 붙은 클래스에 대해 자동으로 Parcelable 구현을 만들어 준다. 즉 개발자가 덜 귀찮아질 수 있고 가독성을 올릴 수 있다.

 

그러나 이걸 보고 바로 사용해보려고 해도 @Parcelize에 컴파일 에러가 발생할 것이다. 앱 수준 gradle에 한 줄만 추가하면 된다.

 

plugins {
    id 'kotlin-android-extensions'
}

 

이렇게 하면 정상적으로 사용할 수 있게 된다. 그런데 이것은 왜 생겨났을까?

안드로이드 앱이 자바 언어로 개발되던 과거에는 Serializable을 사용해서 객체를 이동시킬 수 있었다. Serializable은 자바에서 제공하는 직렬화 인터페이스로, 이걸 구현하면 JVM 차원에서 객체를 바이트 스트림으로 변환해 주고, 이 스트림은 다시 객체로 변환할 수 있다. 그러나 리플렉션이라는 클래스, 인터페이스 등의 코드 구조 정보를 검색, 조작할 수 있는 개념을 사용하기 때문에, 속도가 느리고 많은 임시 객체를 만들 수 있어서 가비지 컬렉션을 유발할 수 있다.

 

이 문제를 해결하기 위해 만들어진 것이 Parcelable과 @Parcelize다. Serializable에 비해 속도는 빨라졌고, 좀 더 코드 가독성을 올릴 수 있게 된 것이다.

객체를 인텐트에 담아서 보내야 할 경우 Parcelable과 @Parcelize를 사용하면 편하고 빠르게 다른 화면으로 이동시킬 수 있으니 필요한 경우 잘 사용하면 좋을 것이다.

반응형
Comments