본문 바로가기

안드로이드

IPC 를 위한 Serializable, Parcelable, Parcel, 그리고 Bundle 까지

반응형

IPC

프로세스 간 통신  ( Internal - Process - Communication, IPC)

프로세스 사이에서 데이터를 서로 주고 받는 행위, 경로, 방법을 의미한다.

 

 

대표적인 IPC
1) 메시지 큐(Message Queue)
프로세서 간 주고 받는 메시지를 커널에 복사하고 읽어가는 방식이다. IPC 내의 메시지를 하나의 구조체 형태로 통째로 주고 받을 수 있어서 구현하기에 편리하다. 여러 가지 이벤트를 하나로 관리 사용하기에 편리한 구조다.

2) 공유 메모리(Shared Memory)
프로세스간에 공유 메모리를 지정하여, 이 영역에 복사하고 읽어가는 방식이다.

3) UDS(Unix Domain Socket)
기존 소켓 API와 유사하게 사용할 수 있다. 또한 여러 가지 이벤트를 하나로 사용하기에 편리한 구조이다.
IPC는 각 프로세스간 어떠한 식으로 데이터를 전송하고 데이터를 받을지에 대한 약속일 뿐이다. 따라서 시스템 레벨에서 별도로 관리하지는 않는다. 각각의 프로세서가 정해진 방법으로 통신을 할 수 있도록 구현을 해야 한다.

 

그 외 : 파일, 신호, 소켓, 파이프, 세마포어 등

 

JAVA의 Serializable

 직렬화란 자바 내부에서 사용하는 Object 혹은 Data를 외부의 자바 시스템에서 사용할 수 있도록 byte 형태로 데이터 변환하는 기술이다.

반대로 역직렬화는 byte 형태를 Object 혹은 Data로 변환하는 기술이다.

 직렬화의 조건은 java.io.Serializable 인터페이스를 상속받아야한다. 직렬화 방법으로는 java.io.ObjectOutputStream를 사용하여 직렬화를 진행한다.

 JAVA의 Serializable은 안드로이드의 Parcelable보다 성능이 좋지 않다고 하는데 이는 Serializable 내부에서 Reflection을 사용하여 직렬화를 처리하기 때문이다. Reflection 은 프로세스 동작 중에 사용되며 처리 과정 중에 많은 추가 객체를 생성 한다. 이 많은 쓰레기들은 가비지 컬렉터의 타겟이 되고 가비지 컬렉터의 과도한 동작으로 인하여 성능 저하 및 배터리 소모가 발생합니다.

 

그리고 안드로이드의 Parcelable

직렬화를 위한 또 다른 인터페이스이다. Reflection을 사용하지 않게 설계되어 있다. 사용자가 명시적으로 작성하기 때문에 자동적으로 처리하기 위한 Reflection이 없어졌다. 마커 인터페이스 인 Serializable 과는 달리 Parcelable 은 구현 해야 하는 필수 메서드를 포함 하기 때문에 클래스에 보일러 플레이트 코드 가 추가 된다. 이는 클래스 를 이해하기 어렵고, 새로운 기능을 추가 하기 힘들게 만든다. 또한 코드의 추가로 클래스가 복잡해 질수록 유지 보수가 어려워지는 원인이 됩니다.

 

Serializable 이 시스템 비용이 발생한다면 Parcelable 은 구현 과 유지, 보수에 드는 사용자의 노력을 비용으로 지불해야 합니다.

Parcel

이 글을 쓰게 한 근본적인 원인... 바로 Parcel 차례이다. 

Parcelable.Creator 를 쓸때 내부 메소드의 파라미터 값을 Parcel이 들어가서 무엇인가 알아보았다.

"IBinder를 통해 보낼 수있는 메시지 (데이터 및 오브젝트 참조)의 컨테이너입니다." -> 안드로이드에 공식사이트에 나와있는 글이다.

안드로이드는 프로세스간 데이터 전달할 때 바인더를 통해 Parcel 객체를 전달한다. Parcel은 추상화된 객체로 데이터와 객체를 갖고 있는 컨터이너이다. 그래서 전달하려는 객체를 Parcel에 저장하여 다른 프로세스로 전달 가능하다. Parcelable은 앞서 설명한 것 처럼 인터페이스며 Parcel에 객체를 write/read 하도록 만들어준다.

 

더보기


https://developer.android.com/reference/android/os/Parcel

 

Parcel  |  Android 개발자  |  Android Developers

Parcel public final class Parcel extends Object java.lang.Object    ↳ android.os.Parcel Container for a message (data and object references) that can be sent through an IBinder. A Parcel can contain both flattened data that will be unflattened on the other

developer.android.com

 

Binder 란?

안드로이드에서 바인더란 각각 독립된 프로세서들을 연결해 주는 역할을 한다. 리눅스에서 System Call을 사용하여 시스템에서 제공하는 프로세서, 파일 시스템 기능을 이용하도록 제공하고 있다.

 바인더의 주 목적은 컴포넌트 기반 시스템 레벨 디자인을 지원할 수 있도록 설계된 오픈 소스 솔루션이다. 즉, 운영체제 혹은 시스템에서 제공해 주는 기능을 각각의 컴포넌트 혹은 모듈 형태로 만들고 이것을 운영할 수 있도록 만들어 주는 것이다.
 안드로이드에서는 각 독립적으로 운영되는 프로세스, 서비스의 기능을 이용할 수 있도록 제공하는 것이 바인더의 핵심이다.

 

Bundle

 Activity 간 데이터 전송에 사용하는 것으로 IPC 직렬화 객체이며 Parcelable을 상속받아 구현한 일종의 Map 클래스이다.

 안드로이드 SDK에 포함되어 있기 때문에 클래스 파일 자체를 배포할 필요가 없다. 번들은 모든 타입의 직렬화 객체를 담을 수 있을 뿐만 아니라 Parcel과 달리 읽고 쓰는 순서를 일치시킬 필요가 없다.

 

참고사이트

 

반응형

'안드로이드' 카테고리의 다른 글

안드로이드 include vs merge 태그 차이  (0) 2021.04.14
AlertDialog  (0) 2021.03.21
안드로이드 접근성 accessibility 에 관하여  (0) 2021.02.07
Android Room  (0) 2021.01.18
RecyclerView 의 Payload  (0) 2020.12.30