안드로이드 앱을 개발할 때 종종 하나의 액티비티 에서 다른 액티비티 로 데이터를 전달하기 위해 인텐트에 전달할 데이터를 추가 합니다.
복잡한 클래스의 객체를 이동하려는 경우 Serializable 또는 Parcelable 를 사용하여 직렬화 하여 인텐트에 추가 해야 합니다.
Serializable 이란 무엇인가?
serial(직렬의) + ~able(~가능한) Serializable
Serializable 은 Android SDK 가 아닌 표준 Java 의 인터페이스 입니다.
이 인터페이스를 구현한 클래스의 객체는 이제 한 액티비티 에서 다른 액티비티 로 이동할 준비가 됩니다. 다음 코드에서 이 인터페이스를 사용하는 것이 얼마나 간단한 지 알 수 있습니다.
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 29 30 31 32 33 34 35 36 37 38 39 | import java.io.Serializable; public class Person implements Serializable { private String firstName; private String lastName; private int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } | cs |
다. 간단하게 implements Serializable 을 추가 하는것으로 Person객체를 다른 액티비티에 전달할 수 있습니다.
사용방법이 쉽다는것은 곧 시스템 적인 비용이 비싸다는것을 의미 합니다.
Serializable 은 내부에서 Reflection 을 사용하여 직렬화를 처리합니다.
Reflection은 프로세스 동작 중에 사용되며 처리 과정 중에 많은 추가 객체를 생성합니다.
이 많은 쓰레기들은 가비지 컬렉터의 타켓이 되고 가비지 컬렉터의 과도한 동작으로 인하여 성능 저하 및 배터리 소모가 발생합니다.
Parcelable 은 무엇인가?
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { private String firstName; private String lastName; private int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.firstName); dest.writeString(this.lastName); dest.writeInt(this.age); } protected Person(Parcel in) { this.firstName = in.readString(); this.lastName = in.readString(); this.age = in.readInt(); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { @Override public Person createFromParcel(Parcel source) { return new Person(source); } @Override public Person[] newArray(int size) { return new Person[size]; } }; } | cs |
물론, Parcelable 을 사용할 때 지불해야하는 비용도 있습니다.
마커 인터페이스인 Serializable 과는 달리 Parcelable 은 구현 해야 하는 필수 메서드를 포함하기 때문에 클래스에 보일러 플레이트 코드가 추가 됩니다.
이는 클래스를 이해하기 어렵고, 새로운 기능을 추가하기 힘들게 만듭니다.
또한 코드의 추가로 클래스가 복잡해 질수록 유지 보수가 어려워지는 원인이 됩니다.
Serializable 이 시스템 비용이 발생한다면 Parcelable 구현과 유지,보수에 드는 사용자의 노력을 비용으로 지불해야 합니다.
Parcelable VS Serializable
Serializable
-장점: 마커 인터페이스이기때문에 사용자가 사용하기 쉽다.
-단점:그만큼 시스템적인 비용이 비싸다 (내부적으로 Reflection이 사용되기때문에)
Parcelable
-장점 : 직렬화 처리 방법을 사용자가 직접 작성하므로 내부적인 Reflection이 필요없다.
따라서 시스템적인 부담이 적으며 빠르다.
-단점 : 구현에 필요한 메서드 때문에 보일러 플레이트 코드가 추가됨.
유지 보수가 어려워짐.
'Android' 카테고리의 다른 글
안드로이드 4대 컴포넌트란 무엇인가? - Activity (0) | 2019.01.09 |
---|---|
안드로이드 4대 컴포넌트란 무엇인가? (0) | 2019.01.09 |
안드로이드 WebRTC 시작하기 -3 (0) | 2018.12.25 |
안드로이드 WebRtc 시작하기 -2 (0) | 2018.12.25 |
안드로이드 WebRTC 시작하기 (1) | 2018.12.24 |