본문 바로가기
JAVA

[자바의 정석]직렬화

by xunxou 2018. 9. 11.

 

회사에선 코딩을 완료 한 후 commit 전에 sonarlint를 돌린다.

그리고 고쳐야하는게 있으면 가이드에 따라 고치는 절차를 거친다.

 

그 중 직렬화를 하라는 가이드가 있었다.

그때 직렬화가 무엇인지 검색해서 몇번이나 읽어봤었는데

 

객체를 컴퓨터에 저장했다가 다시 꺼내쓴다거나, 

네트워크를 통해서 객체를 주고받는 등등의 말들이 잘 이해가 가지 않았다.

 

블로그의 글들을 읽어봐도 완벽하게 이해가 되지않아서 대략만 정리하고 넘어갔는데

자바의 정석 목차를 보다가 직렬화에 대한 내용이 있어서

이전의 궁금증을  해소하고자, 오늘은 직렬화를 공부했다.

 

해당 내용은 2018.09.11 ~ 2018.09.22 이틀간의 기록이다. (공부를 찔끔찔끔해서..)

 

 

 

직렬화
직렬화란 객체를 데이터 스트림으로 만드는 것을 말한다.즉, 객체에 저장된 데이터를 스트림에 쓰기위해서 연속적인 데이터로 변환하는 것을 말한다.(반대의 경우는 역직렬화)

객체를 스트림으로 만든다는 말이 이해가 가지 않아 네이버 지식사전에서 찾아보았다.
컴퓨터 인터넷 IT용어 대사전에서는 아래와 같이 정의하고 있다.데이터 스트림[data stream](동의어: 데이터열[data row])데이터가 열을 지어 흐르는것처럼 입력되는것. 데이터 통신에서 데이터를 비트의 열로 변환하여 직렬로 전송하는것.
IT용어사전에서는 보다 여러가지로 정의하고 있다.

데이터 스트림[data stream]

1. 한번의 읽기 또는 쓰기동작으로 전송되는 정보.

2. 정해진 포맷을 사용하여 문자 또는 바이트 형식으로 송수신되는 데이터 항목의 연속적인 흐름

3. 한 장치에서 다른 장치로 보내지는 모든 정보

4. 데이터의 양이 한정되어 있지 않고 지속적으로 생성되고, 시간에 따라 값이 변하는 데이터의 흐름



요약해서 말하면 직렬화는 JVM메모리에 있는 객체를 파일에 저장하거나 네트워크를 통해 다른 컴퓨터에 보내기 위해서 데이터 스트림형태로 만드는것을 말한다.
* 스트림데이터는 메모리에 저장된다.사용자가 입력한 데이터를 저장하는것을 입력, 저장된 데이터를 사용자가 보도록 하는것을 출력이라고 한다.입출력 과정이 가능하도록 하는 객체를 자바에서는 스트림이라고 한다.
+ 데이터 스트림으로 만든다는 것은 객체를 바이트(byte) 형태로 만든다는 것이다.(컴퓨터가 처리하는 정보의 기본단위를 비트(bit). 비트를 일정단위로 묶은것을(8개) 바이트(byte)라고 한다.)
이렇게 하는 이유는 객체를 파일에 저장하거나 네트워크를 통해 다른 컴퓨터로 보내려면 객체의 값들을 일일이 바이트형태로 만들어줘야한다.그런데 직렬화를 함으로써 객체를 직접 바이트로 분해할 필요 없이 객체 데이터 자체를 직접 입출력 하도록 한다.


객체에 대한 복습객체는 클래스에 정의된 인스턴스 변수의 집합이다.인스턴스 변수는 인스턴스마다 각각의 값을 가지기때문에 별도의 메모리공간이 필요하다.메소드는 변하는 것이 아니라서 인스턴스마다 별도의 메모리 공간을 사용할 필요가 없다.
객체를 저장한다는 의미는 객체의 모든 인스턴스 변수값을 저장한다는 뜻이다.저장한 객체를 다시 생성하려면 객체를 생성한 후 저장했던 값을 읽어서 생성한 객체의 인스턴스 변수에 저장한다.
두 객체가 동일한지 판단하는 기준은 두 객체의 인스턴스 변수의 값들이 같고 다름에 따라 판단한다.
객체를 직렬화/ 역직력화 할때는 ObjectInputStream과 ObjectOutputStream을 사용한다.

 

 

 

[출처] - 자바의 정석