화면 간의 데이터 이동은 인텐트를 통해 이루어진다. String, Int와 같은 자료형 간의 이동은 바로 할 수 있지만 data class와 같은 객체를 이동시켜야하는 경우는 직렬화 과정이 필요하다. 이러한 직렬화 과정에는 두 가지 기법이 있다.
Android SDK가 아닌 자바 인터페이스이며 Reflection을 사용하여 직렬화를 처리하게 된다.
Reflection이란 구체적인 클래스 타입을 알지 못해도 해당 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다. 프로세스 동작 중에 사용되며 처리 과정 중 많은 추가 객체를 생성한다. 이와 같이 이미 사용된 객체들은 GC의 타겟이 되며 과도한 GC동작으로 인해 성능 저하 및 배터리 소모가 발생할 수 있다.
Android SDK이며, Reflection을 사용하지 않도록 설계되었다.
직렬화 처리 방법을 사용자가 직접 명시적으로 작성하기 때문에 자동으로 처리되는 Reflection이 필요없는 것이다. 그렇기 때문에 보일러 플레이트 코드가 발생하게 되고 유지보수하기 힘들어진다.
GC의 동작으로 인해 Serializable보다 Parcelable이 성능적으로 더 좋다는 것을 확인할 수 있다. 하지만 두 직렬화 방식을 비교한 흥미로운 글을 보았다.
Parcelable vs Serializable , 정말 Serializable은 느릴까?
위의 내용을 요약하면 Serializable이 Parcelable과 같이 writeObject
readObject
와 같은 메서드를 추가하여 자동으로 처리되는 직렬화 프로세스를 사용자가 구현한다면 어떻게 되는지 테스트해보았다. 그렇다면 Reflection이 동작하지 않을 것이고 GC로 인한 성능저하가 발생하지 않을 것이다. 그 결과 Serializable이 Parcelable보다 속도가 더 빨라진 것을 확인할 수 있다.
Reflection으로 인해 성능 저하가 발생한다는 것이 핵심이라고 생각하고 직렬화 프로세스를 직접 구현하게 되면 속도가 훨씬 빨라진다는 것을 확인할 수 있었고, Serializable과 Parcelable의 비교를 어떻게 하느냐에 따라서 어떤 방식의 성능이 좋은지 판단할 수 있다.