brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Oct 17. 2018

직렬화(Serialization)

#75 독자적인 직렬화 형태의 사용을 고려하자

Effective Java - 직렬화(Serialization)


#75 독자적인 직렬화 형태의 사용을 고려하자


#01 serialized form

이전 글을 통해 알아봤듯이, Serializable 인터페이스를 구현하기 앞서 유연성, 성능, 정확성 관점에서 종합적으로 판단해야 합니다.


한번 Serializable 인터페이스를 구현하게 되면 상속이나 유지 보수 측면에서 볼 때, 해당 클래스를 함부로 수정하거나 삭제할 수 없기 때문입니다.


좀 더 효율적인 Serializable 인터페이스 구현, 즉 직렬화를 위해 기본 직렬화 형태와 독자적인 직렬화 형태에 대해 알아보겠습니다.




기본 직렬화 형태

기본 직렬화 형태는 직렬 화하는 시점의 특정 객체에 관련된 모든 데이터를 직렬화 하는 것입니다.

객체의 필드 값

객체가 필드의 객체 참조로 포함하고 있는 모든 객체들의 필드 값

객체의 클래스의 모든 슈퍼 클래스 정보 등


기본 직렬화는 모든 데이터를 직렬 화합니다.

즉, 물리적으로 연결된 모든 데이터를 직렬 화하게 되기 때문에, 이 물리적 데이터(모든 데이터)와 논리적 데이터(실제로 객체를 표현하는데 쓰이는 데이터)가 동일한 경우에 적합합니다.


#02 Name class


Name이라는 클래스를 보면, 성, 이름, 중간 이름을 나타내는 3개의 문자열로 이루어져 있습니다.

이 인스턴스 필드(물리적)를 통해 성, 이름, 중간 이름(논리적)을 정확히 반영하고 있기에, 기본 직렬화 형태가 적합합니다.




#03 StringList class


StringList 클래스는 문자열 순차를 나타냅니다.

next와 previous를 가지고 있는 Entry 클래스와 StringList 모두 기본 직렬화 형태로 이루어져 있습니다.


이 StringList 클래스에는 기본 직렬화 형태로 인한 몇 가지 문제점들이 있습니다.


1. 외부 API가 현재의 내부 구현에 영원히 얽매이게 된다.

직렬화를 하게 되면 StringList.Entry 클래스는 public API의 일부분이 됩니다.

따라서 StringList.Entry 클래스를 함부로 수정하거나 삭제할 수 없습니다.


2. 과도한 저장 공간을 차지할 수 있다.

문자열 순차를 나타내는 클래스이기 때문에, 클라이언트 입장에선 이 문자열들만 알면 됩니다.

하지만 기본 직렬화 형태는 불필요한 데이터까지 포함하게 되므로 필요 이상의 저장 공간이 필요합니다.


3. 시간이 오래 걸린다.

모든 객체의 데이터와 클래스 구조까지 파악해야 하기 때문에 시간이 오래 걸립니다.


결국 이러한 문제들은 물리적 데이터와 논리적 데이터가 서로 상이할 때 발생하게 됩니다.




독자적인 직렬화 형태


#04 StringList class

StringList 클래스에서 상세한 물리적 데이터를 빼고, 논리적 데이터만 직렬화 하면 이러한 기본 직렬화 형태로 인한 문제를 해결할 수 있습니다.

1. int size와 Entry head는 transient 변경자를 추가해 기본 직렬화 형태에서 뺄 수 있습니다.

2. StringList.Entry 클래스(물리적 데이터)를 직렬화 하지 않습니다.


#05 StringList class


3. writeObject, readObject 메서드를 통해 독자적인(논리적인) 직렬화 형태를 구현합니다.

int size와 Entry head를 transient 변경자 통해 기본 직렬화 형태에 포함시키지 않았기 때문에, 그냥 역직렬 화하게 되면 기본 값(0, null)을 얻게 됩니다.


이러한 독자적인 직렬화 형태를 통해, 불필요한 물리적 데이터 없이 논리적인 데이터만으로 직렬화를 구현할 수 있습니다.




클래스를 직렬 화할 때, 기본 직렬화 형태와 독자적인 직렬화 형태 중 어떤 것을 이용해야 할지 고민할 필요가 있습니다.





매거진의 이전글 직렬화(Serialization)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari