티스토리 뷰

반응형

액티비티간 Intent로 값 넘기기 (클래스)

FirstActivity에서 SecondActivity로 값을 넘겨주고 싶을때 intent를 사용해서 전달이 가능한데, Int형이나 Array<Int>, String등의 자료형을 넘겨주려면 이 게시글을 참고하면 된다. 

 

[Android][Kotlin] 액티비티간 값 전달, intent로 값 전달

firstActivity에서 secondActivity 화면을 띄울때 intent와 startActivity를 사용한다. 그때 값도 같이 전달하고 싶다면 중간데 intent.putExtra(KEY값, VALUE값)을 추가해주면 된다. firstActivity.kt val intent..

yuuj.tistory.com

 

이처럼 별도의 코드를 구현하지 않고 기본적으로 intent만 사용해서 전달할 수 있는 예시는 다음과 같다. 

 

그러나 만약 위의 자료형들이 아니라 사용자가 직접 만들어서 사용하고 있는 클래스 형태의 데이터를 넘겨주고싶다면?

그럴땐 직렬화를 사용하면 된다. 

 

 

 

직렬화란?

  • 직렬화는 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 내에 존재하는 정보는 즉 객체를 말한다.

코틀린에서 직렬화와 intent를 통해 액티비티에서 다른 액티비티로 값을 전달하는 방법은 세가지가 있다. 

 

 

 

Serializable

먼저, Serializable은 자바의 표준 인터페이스로 이렇게 데이터 클래스의 뒤에 : Serializable만 달아주면 되기 때문에 굉장히 간편하다는 장점이 있다. 

data class Person(
    val username: String,
    val thumbnail: String
) : Serializable

그러나 속도가 굉장히 느리다는 단점이 있다. 따라서 프로젝트 내에서 Serializable을 많이 사용하면 할수록 성능은 저하된다. 

 

Parcelable

Parcelable은 자바 기반이 아닌 Android SDK의 인터페이스로, Serialize보다 빠르며 안드로이드에서 사용하길 권장한다.

data class User(
        var username: String?,
        var thumbnail: String?,
        var age: Int?
) : Parcelable {

    constructor(parcel: Parcel) {
        parcel.run {
            username = readString()
        }
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.writeString(username)
        dest?.writeString(thumbnail)
        dest?.writeInt(age ?: 0)
    }

    override fun describeContents(): Int = 0

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}

다만, 필요한 코드를 모두 개발자가 구현해줘야 하기 때문에 그러나 간단한 값을 넘겨주는것 치고는 너무 작성해야 할 코드가 많고, 보일러플레이트 코드가 많이 생긴다.

 

 

 

Parcelize

이런 문제를 보완하기 위해 나온 코틀린의 @Parcelize는 시간과 노력을 덜 들이고 손쉽게 데이터 클래스를 Parcelable하게 만들어 준다. Serializable의 간편성과 Parcelable의 성능을 모아둔 격이다. 

Parcelize를 사용하기 위해서는 데이터 클래스에 @Parcelize 어노테이션을 달아주기만 하면 끝이다. 

 

자세한 적용법은 다음과 같다.

 

 

build.gradle (:app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

androidExtensions {
    experimental = true
}

먼저 그래들 파일에 플러그인 추가를 해주고,

 

 

StudentDataClass.kt

@Parcelize
data class User(
        val username: String,
        val thumbnail: String,
        val age: Int
) : Parcelable

전달하고싶은 데이터의 클래스에 @Parcelize 어노테이션을 달아준다. 

 

 

FirstActivity.kt

val intent: Intent = Intent(this, SecondActivity::class.java)
intent.putExtra("DATA", USER("name", "thumbnail", 20));
startActivity(intent)

보내는 액티비티에서는 이렇게 넘겨주고,

 

 

SecondActivity.kt

val intent: Intent = getIntent()
var studentDataClass = intent.getParcelableExtra("DATA")

받는 액티비티에서는 이렇게 받으면 된다.

 

 

 

참고로 "DATA"는 넘겨주는 값들의 구별을 위한 태그처럼 사용되기 때문에 원하는 이름으로 바꿔서 사용하면 된다. 

 

 

 

 

참고

 

How Kotlin’s @Parcelize makes it faster to pass data between Android Components?

Primitive values in Android can be sent along with the Intent from one Android component to another but Android does not support sending…

medium.com

 

 

[Android] 직렬화

직렬화란? 역직렬화란? Serializable Parcelable

woovictory.github.io

 

[Android] Kotlin Parcelize 등장 - Serializable vs Parcelable

안드로이드 컴포넌트나 Fragment간에 클래스로 데이터를 주고 받을 때 Serializable, Parcelable을 구현해야 합니다. 직렬화/역직렬화, 마샬링/언마샬링 이라고도 하는 이 두 기법은 아주 빈번하게 사용

simsi6.tistory.com

 

반응형