티스토리 뷰
[Android][Kotlin] Intent로 Class 값 넘기기 (Parcelize, Serializable, Parcelable 차이)
yoo.o 2021. 3. 25. 02:28액티비티간 Intent로 값 넘기기 (클래스)
FirstActivity에서 SecondActivity로 값을 넘겨주고 싶을때 intent를 사용해서 전달이 가능한데, Int형이나 Array<Int>, String등의 자료형을 넘겨주려면 이 게시글을 참고하면 된다.
이처럼 별도의 코드를 구현하지 않고 기본적으로 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"는 넘겨주는 값들의 구별을 위한 태그처럼 사용되기 때문에 원하는 이름으로 바꿔서 사용하면 된다.
참고
- Total
- Today
- Yesterday
- Kotlin
- 코틀린 리스트뷰
- 데이터바인딩 뷰바인딩 차이
- 카카오 기출
- counting sort
- 코틀린 뷰페이저
- 시뮬레이터 키보드
- 투포인터 알고리즘 파이썬
- flutter simultor
- 카카오톡으로 로그인 오류
- 안드로이드
- 백준 1644
- TextFormField keyboard
- 백준 1806
- 전화번호목록 파이썬
- 카카오 키해시
- 코틀린 데이터바인딩
- 코틀린 뷰바인딩
- 프로그래머스
- kotlin fragment
- 투포인터 알고리즘
- 파이썬 최대공약수
- 백준알고리즘
- 코틀린 바텀네비게이션
- 안드로이드 카카오톡으로 로그인
- 코틀린
- 소수 구하기 파이썬
- 백준
- 안드로이드 키해시
- 백준 2003
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |