본문 바로가기

Android Develop

[Android] 객체 직렬화, Serializable

728x90
반응형

안드로이드로 개발을 하다가, 만들어둔 객체를 다른 Activity에 Intent로 넘겨주고싶어서 찾아보니

Serializable을 이용하면 해결할 수 있다는걸 알게 되었는데요,

 

 

이 Serializable, 즉 직렬화가 무엇인지 알아보는 시간을 가져보고자 합니다!

해당 글은 아래의 글들을 참고하여 작성하였습니다 :)

wooooooak.github.io/android/2019/09/19/Serializable-vs-Parcelable/

lueseypid.tistory.com/42

daem0n.tistory.com/entry/%EB%A9%80%ED%8B%B0%EC%BD%94%EC%96%B4-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%9D%98%EC%A1%B4%EC%84%B1rockdrumy.tistory.com/1044

 

 

우선 직렬화란, 저장 장치나 저장거나 네트워크 전송을 하기 위해서 객체를 텍스트나 이진 형식으로 변환하는 것입니다!

이를 통해 객체의 내용을 바이트 단위로 변환하여 파일이나 네트워크를 통해 송수신이 가능하도록 해줍니다

자바 I/O가 자동적으로 처리해주는 것이기 때문에 운영체제가 달라도 문제가 되지 않습니다

 

 

예를 들어서, Dog("BINGO", 3, "black")를 직렬화한다고 하면 {"name":"BINGO", "age":"3", "color":"black"} 의 형식으로 나타낼 수 있겠죠

역직렬화는 말 그대로 {"name":"BINGO", "age":"3", "color":"black"}의 형식을 Dog("BINGO", 3, "black") 로 나타내는 것을 말합니다

 

 

 

우리는 보통 값을 다른 곳에 넘기고자 할때 함수의 파라미터로 넘기는 방식을 자주 사용하는데,

액티비티간의 데이터 전달은 이러한 파라미터 전달과 같은 데이터 공유 방식으로는 할 수 없습니다

 

 

 

그 이유는, 위와 같은 방식으로 데이터를 공유하게 되면 프로세스간 의존성이 생기기 때문이죠!

우리가 하나의 스마트폰에서 하나의 앱만 사용하지 않듯이, 하나의 앱에서도 하나의 프로세스만 사용하지 않습니다

 

그런데 만약, 이러한 프로세스가 우리가 객체의 주소를 넘기는 방식으로 데이터를 공유하게 된다면 어떻게 될까요?

우리가 만든 프로그램이 만약 빠른 처리를 위해서 순차적이 아니고 병렬적으로 처리를 하고 있다면,

이 데이터를 넘기는 사이에 어디에선가 데이터가 변경되어 다른 프로세스로 넘겨질지도 모릅니다!

 

따라서 우리는 이러한 프로세스간에 의존성이 생기지 않도록, 주소값이 아닌 데이터 그대로를 보내고자 직렬화를 사용하게 됩니다

 

 

 

직렬화는 표준 자바 인터페이스입니다. 따라서 아주 간단하게 액티비티간에 데이터를 공유하고자 하는 객체 클래스가 Serializable을 구현하도록 하면 됩니다.보통 interface는 class내에서 메소드를 구현하는 방식으로 사용되는데 Serializable 인터페이스는 그럴 필요 없이 선언만 해주면 된다고 하네요 ㅎㅎ

 

import java.io.Serializable;

public class Dog implements Serializable {
    ...
}

 

위와 같이 Serializable을 implements함으로써, 송신측이 직렬화 된 객체를 메모리에 저장하고,

메모리에서 다시 해당 데이터를 역직렬화하여 수신측에게 전달하는 방식 등을 사용하게 됩니다

 

 

더보기
implements를 하여 사용해야 하는 interface class이지만 메소드 등을 구현할 필요가 없는 것을 Marker Interface라고 합니다. 따라서 instanceof 라는 명령어를 이용해여 해당 class가 serializable을 implements로 받는 class인지를 판별하여, 알맞은 처리를 해주는 방식으로 차용된다고 합니다.

 

 

 

728x90
반응형