본문 바로가기
개발노트/Kotlin

8주차 1일 Serializable 그리고 Parcelable

by 시계속세상은아직돌아가는중 2023. 8. 28.

1. Serializable

Serizlzable은 java에서 기본적으로 제공하는 인터페이스로, 액티비티 -> 액티비티에서 정보를 전달할 때 사용할 수 있다.

putExtra로 보낸 데이터를 getSerizlzable 메소드를 통해 데이터로 받을 수 있다.

 

예를들어 이전 구현했던 과제를 보자면

 

data class Friend(
    val id: String, val name: String, val mbti: String, val stateM: String,
    val gitURL: String,
    val velURL: String
) : Serializable

 

해당 데이터 클래스를 Serializable을 상속시키는 것으로 해당 인터페이스를 사용할 준비를 끝낸다.

 

내부적으로 알아서 직렬화,역직렬화를 완성시켜주기 때문에 사용하기에는 편리하나, 불필요한 리플렉션이 발생하여 어플리케이션의 성능을 떨어트리는 결과물이 완성된다. 이는 Serializable 인터페이스에 좀 더 하드코딩으로 역직렬화를 구현해내면 해소되는 문제이나, 우리는 그럴 필요가 없다.

 

좋은 퍼포먼스를 내며 액티비티간 데이터를 보낼 수 있는 Paracelable이 코틀린에 존재하기 때문이다.

 

2. Parcelable 

Paracelable은 직렬화는 알아서 해주지만 역직렬화를 프로그래머가 직접 구현함으로써 필요없는 값을 발생시키지 않을 수 있다. 그러나 리플렉을 발생시키지 않기 위해 사용하는 보일러 플레이트 코드들이 무수히 많이 생겨서 유지보수가 힘들어진다.

 

그런데 안드로이드 스튜디오에서는 @Paracelize를 사용하면 역직렬화를 알아서 해준다!

이 플러그인을 사용해서 만들어지는 어노테이션(보일러 플레이트 코드들)은 왠만해서는 건드릴 일이 없으므로 어떻게 구성되어있는지만 알아두면 좋을 것이다.

 

해당 인터페이스를 사용할려면 먼저 gradle로가서

 

plugins {
    id("kotlin-parcelize")
}

해당 플러그인을 추가해준 다음 sync now를 해주면 사용이 가능하다.

 

import kotlinx.parcelize.Parcelize

@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

 

그 다음으로는 직렬화할 class에 @Paracelize 속성을 추가한 다음 Paracelable 인터페이스를 상속시켜준다.

 

 

 

3. 결론

 

Serializable은 제한적으로 사용하였을 때 Paracelible보다 좋은 성능을 낼 수 있기도 하다.

그러나 안드로이드 스튜디오에서는 Paracelible을 사용할 때 생성되는 보일러 코드들을 플러그인(@Paracelize)을 통해 간편하게 줄일 수 있다.

 

따라서 구태여 제한적으로 사용하기 보다는 좀 더 간결하고 깔끔하게 사용할 수 있는  Paracelible을 사용하는 것이 좋을 것 이다.

 

4. const val/val

 

Const val은 val보다 강력한 불변성을 가지게 된다.

companion object 안에 선언되며, 컴파일 되는 순간 메모리에 존재하기 때문에 직접적으로 접근할 수 있다.

 

const val은 어떤 함수,클래스에서 사용 되더라도 상태에 상관없이 불변의 값을 가지게된다.

 

const val의 선언은 보통 대문자와 언더바를 사용한다.

 

companion object{
        const val CONST_VAL = 100
    }

이런식으로 말이다.

 

5. const val로 인텐트 보내기

 companion object{
        const val EXTRA_TITLE:String = "title"
        const val EXTRA_DETAIL:String = "detail"
    }
    
         val intent = Intent(this@TodoaddActivity, MainActivity::class.java).apply {
                putExtra(EXTRA_TITLE, title)
                putExtra(EXTRA_DETAIL, detail)
            }

key값을 companion object로 사용하면 좀더 체계적인 관리를 할 수 있다.

해당 key값은 사용되는 액티비티와 상호작용하는 액티비티 간에서만 사용되는 것이 대부분이므로, 같은 속성끼리 묶어둔다고 볼 수도 있다.

 

또한 key값을 companion object에서 사용한다면, 상호작용하는 액티비티에서 직접적으로 호출할 수 있으므로 재사용성이 높아진다.

 

5.정규 표현식

코틀린에서는 regex 라이브러리로 사용할 수 있으며 잘만 쓴다면 코드의 길이를 극적으로 단축시킬 수 있다.

 

이전에 내가 구현했던 MBTI판단은

 

mbti.matches(Regex("[EI][SN][TF][JP]"))

무수한 if문을 사용해서도 구현할 수 있지만, 이렇게 간단하게 EI SN TF JP가 해당 각각의 공간에 들어가는지 판단할 수 있다. 무척이나 유용하지 않을 수 없다.

 

자세한건 참고블로그로!

 

 

 

참고 블로그

1)리플렉션

https://www.charlezz.com/?p=756

 

안드로이드와 Java의 Reflection | 찰스의 안드로이드

Reflection이란? Reflection은 자바 언어의 기능중 하나로 프로그램 내부 속성을 조작 할 수 있게 합니다. 예를 들어 Java클래스가 가지고 있는 모든 멤버의 이름을 가져와서 표시 할 수 있습니다. 다른

www.charlezz.com

https://jeongkyun-it.tistory.com/225

 

[Java] 리플렉션 (Reflection)이란 무엇일까? (개념/ 예시)

서론 이번 포스팅에서 다룰 내용은 '리플렉션'이다. 최근 "리플렉션이 무엇인가요?" 라는 질문을 받았는데, 제대로 된 답변을 못한 것 같다. C# 개발을 할 때 분명 사용은 해보았지만 개념적으로

jeongkyun-it.tistory.com

 

2) Serializable 그리고 Parcelable 

https://www.charlezz.com/?p=823

 

Parcelable과 Serializable 비교 | 찰스의 안드로이드

Serializable은 분명히 개발자 입장에서는 편합니다. 인터페이스 구현만 하면되니까요. 하지만 앱 사용자에게는 퍼포먼스저하와 베터리 드래인이라는 큰 단점을 안겨 줍니다. 조금은 귀찮더라도 Se

www.charlezz.com

https://blog.naver.com/PostView.nhn?blogId=bestowing&logNo=222014802794

 

[Android] Parcelable이란?

글 구성 1. 정의 (Parcelable이란) 2. 사용하는 이유 3. 사용 예시 3-1. 인스턴스 하나 전달 3-2. Array...

blog.naver.com

https://developer.android.com/kotlin/parcelize?hl=ko

 

Parcelable 구현 생성기  |  Kotlin  |  Android Developers

Parcelable 구현 생성기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. kotlin-parcelize 플러그인은 Parcelable 구현 생성기를 제공합니다. Parcelable 지원을 포함하려

developer.android.com

https://nosorae.tistory.com/entry/AndroidKotlin-Intent-%EC%97%90-%EC%BB%A4%EC%8A%A4%ED%85%80-%EA%B0%9D%EC%B2%B4-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0-%EC%A7%81%EB%A0%AC%ED%99%94-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94-Serializable-%EA%B3%BC-Parcelable-Parcelize

 

[Android/Kotlin] Intent 에 커스텀 객체 전달하기? 직렬화, 역직렬화 Serializable 과 Parcelable, @Parcelize

[시작하며 (반성)] 한 화면에서 다른 화면으로 이동할 때 데이터를 전달하려고하는 데, Primitive type 이 아닌 내가 만든 data class(디자인 패턴을 관점에서는 POJO 클래스, Model) 을 통째로 전달하고 싶

nosorae.tistory.com

속도차이

 

https://medium.com/@limgyumin/parcelable-vs-serializable-%EC%A0%95%EB%A7%90-serializable%EC%9D%80-%EB%8A%90%EB%A6%B4%EA%B9%8C-bc2b9a7ba810

 

Parcelable vs Serializable , 정말 Serializable은 느릴까?

원문 : “Parcelable vs Serializable”

medium.com

 

3) VALconst VAL

https://angangmoddi.tistory.com/201

 

코틀린 17. const와 상수

이번 글에서는 const라는 것에 대해서 알아보도록 하겠습니다. 이 카테고리 초기에 변수에 대해서 알아봤을 때, 저희는 변수를 선언하는 방법을 두 가지 알아봤습니다. 언제든 값을 바꿀 수 있는

angangmoddi.tistory.com

 

4)정규표현식

https://hamait.tistory.com/342

 

정규표현식 (Regex) 정리

정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헷갈리곤 하기에 주요 사용예를 내가 나중에 다시 봤을 때 편하도록 정리하여 보았다. 정규 표현식의 용어들정규 표현식에서 사용되는

hamait.tistory.com