Kotlin/TIL

TIL (04.09)

내손은개발 🐾 2024. 4. 9. 21:26

Kotlin


직렬화 ?

직렬화(serialization)는 객체나 데이터 구조를 일련의 바이트로 변환하는 프로세스를 말한다.

이렇게 직렬화된 데이터는 파일에 저장하거나 네트워크를 통해 전송할 수 있다.

 

장점

1. 데이터 영속화

프로그램이 종료되거나 재시작되어도 데이터를 보존해야 하는 경우가 많다. 이런 경우 데이터를 파일이나 데이터베이스에 저장할 필요가 있다. 데이터를 직렬화하면 데이터 구조를 파일로 저장할 수 있다. 그리고 프로그램이 재실행되거나 다시 시작될 때 이 파일에서 데이터를 읽어와서 객체를 다시 만들 수 있다.

 

2. 네트워크 통신

서로 다른 시스템 간에 데이터를 주고받아야 할 때도 직렬화가 필요하다. 네트워크를 통해 데이터를 전송하려면 데이터를 바이트 스트림으로 변환해야 한다. 직렬화 된 데이터를 전송하면 수신 측에서는 역직렬화하여 객체나 데이터 구조로 다시 변환할 수 있다.

3. 분산 시스템

여러 대의 컴퓨터나 프로세스가 데이터를 주고받아야 할 때가 많다. 이런 경우 직렬화하여 전송하고, 수신 측에서는 역직렬화하여 데이터를 처리한다.

4. 메모리 맵핑

일부 시스템에서는 파일을 메모리에 매핑하여 직접 읽고 쓰는 방식으로 데이터를 처리한다. 이 때, 데이터를 직렬화하여 파일에 저장하고, 필요할 때마다 메모리에 매핑하여 사용할 수 있다.

 

Serializable ? Parcelable ?

객체를 직렬화할 수 있도록 해주는 인터페이스이다.

복잡한 클래스 데이터를 전달하기 위해 사용된다.

데이터를 인텐트로 전달하거나 파일로 저장하는 등의 작업을 할 때 사용할 수 있다.

 

 

Serializable

Serializable은 Java에서 제공하는 표준 인터페이스이다. Serializable을 구현한 클래스는 직렬화 대상이 된다.
장점

사용하기 편하다. 따로 구현할 코드가 없이 사용가능하다.

단점

Reflection을 사용하기 때문에 느리고 메모리를 많이 쓴다.

 

예시코드

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

 

 

 

Parcelable

안드로이드 SDK에서 제공하는 인터페이스이다. 이것을 구현한 클래스의 객체는 직렬화 가능하다.
Parcelable은 Reflection이 런타임에 하는 작업을 개발자가 대신 한다. 개발자가 직접 직렬화/역직렬화 하는 로직을 작성해야 한다.
장점

Serializable에 비해 빠르고 리소스를 덜 소모한다.

Reflection 과정 없이 미리 작성된 로직을 바탕을 빠르게 직렬화/역직렬화 할 수 있다.

단점

직접 작성해야 하는 코드가 많다.

 

예시코드

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)
        }
    }
}

 

Serializable vs Parcelable

코드를 보고 느꼈겠지만 코드 양부터 차이가 난다.

둘의 큰 차이점으로는 편리함과 속도이다.

Pacelable이 속도가 더 빠르지만, 유지 비용이 Serializable에 비해 많이 소요된다.

Serializable이 상대적으로 속도가 느린 이유는 자바의 Reflection을 사용하기 때문이다.

Reflection을 프로세스 동작 중에 많은 추가 객체를 생성한다. 추가 객체 생성 후에 나온 쓰레기들으 ㄴ가비지 컬렉터의 타겟이 되고 과도한 동작으로 오버헤드가 발생한다.

 

 

하지만

Kotlin에서는 Parcelize를 제공한다.

새로운 클래스를 생성도 필요 없고 @Parcelize 어노테이션을 추가하는 것만으로 직접 Parcelable 관련 코드를 작성 한 것과 같이 동작한다

Parcelize는 Serializable의 간편함과 Parcelable의 속도 측면의 장점을 모두 누릴 수 있는 기술로, Parcelable의 구현을 자동으로 생성해준다.

 

사용방법

implementation

plugins {
		...
    id("kotlin-parcelize")
}

 

어노테이션 추가

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

 

 

++

추가로 Activity간 데이터 전달

전송
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("Key", value)
받기
val data = intent.getParcelableExtra("key", Donut::class.java)

 

.

 

 

 

 

 

 

 

 

 

ref

 

[Android] Serializable vs Parcelable

익숙한 Serializable과 Parcelable Serializable과 Parcelable, 익숙한 녀석들이다. Bundle에 객체를 담아 Intent와 arguments를 통해 다른 곳으로 전달하려면 객체의 클래스가 둘 중 하나를 구현(상속)해야 한다. 나

best-human-developer.tistory.com

 

'Kotlin > TIL' 카테고리의 다른 글

TIL (04.15)  (0) 2024.04.15
TIL (04.12)  (0) 2024.04.12
TIL (04.08)  (0) 2024.04.08
TIL (04.05)  (0) 2024.04.05
TIL (04.04)  (0) 2024.04.04