개인참고자료/자바(네트워크)

객체 스트림 - 소개(마샬링, 언마샬링)

경진 2008. 7. 16. 23:27
객체 스트림 

객체스트림이란 객체를 아주 쉽게 전송할 수 있는 방법을 말한다.
객체가 전송된다는 의미는 객체가 내부적으로 참조하는 개체들 역시 함께 전송되는 것을 뜻한다.

객체가 전송되거나 쓴다고 하면, 보통 데이터만 해당된다고 생각할 수 있다.
객체가 전송된다는 것은 애플릿(Applet), 윈도우 등도 전송될 수 있다는 것을 의미한다.

객체를 전송하려면 다음과 같은 순서를 거쳐야 한다.

1. 데이터를 특정 통신 채널로 보낼 수 있는 형태로 바꾼다. 이를 마샬링(marshaling)이라고 한다.
2. 변환된 데이터를 전송하거나 쓴다.
3. 변환된 데이터를 읽어 들여 원래의 형태로 변환한다. 이를 언마샬링(unmarshaling)이라고 한다.

마샬링

마샬링이란 데이터를 바이트의 흐름으로 만들어 TCP와 같은 통신 채널을 통해서 전송하거나 스트림으로 써 줄 수 있는 형태로 바꾸는 과정을 말한다.

마샬링 될 수 있는 데이터는 기본 자료형(boolean, byte, char, short, int, long, flloat, double)과 java.io.Serializable 인터페이스를 구현하고 있는 객체만 가능하다.

기본 자료형이 정수일 경우에는 4바이트로 쪼개져서 전송된다. 하지만 객체일 경우에는 이보다 훨씬 복잡한 과정을 거치게 되는데, 객체 내부적으로 다른 객체를 참조할 수 있기 때문이다. 객체 스트림은 객체의 내부적인 참조까지도 유지하기 위한 방법을 제공해 준다.

마샬링은 객체 스트림인 ObjectOutputStream에 의해 제공된다. 그리고 ObjectOutputStream에 의해서 객체는 직렬화되어 전달된다. 객체 직렬화(Object Serialization)란 실제로 객체를 마샬링한다는 의미가 있다.

API에서 java.io.Serializable 인터페이스를 살펴보면 구현해야 할 메소드가 하나도 없는 것을 알 수 있다. 이러한 인터페이스를 마크 인터페이스(Mark Interface)라고 하는데, 마크 인터페이스는 메소드를 구현하는 것이 목적이 아니라 표시만 해두는 기능을 한다.

따라서 객체 직렬화 시에 객체가 java.io.Serializable 인터페이스를 구현하고 있는지 확인해서 구현했을 경우에만 마샬링되게 한다.

ObjectOutputStream은 해당 객체가 java.io.Serializable 인터페이스를 구현하고 있는 것을 알려면 instanceof 연산자를 이용한다.

※ 특정한 클래스를 상속하거나 인터페이스를 구현했는지 알려면 instanceof 연산자를 이용한다.

전송

데이터를 발신지에서 목적지로 전달하는 과정을 말한다. 전송을 위해서 객체 스트림은 바이트 기반의 표준 스트림을 이용하게 된다.
 
네트워크에 대한 전송뿐만 아니라 파일에 쓰기를 할 경우에도 객체 스트림은 바이트 기반의 표준 스트림을 이용한다.

언마샬링

언마샬링이란 마샬링과 반대로, 전송받은 데이터를 원래의 형태로 변환하는 과정을 뜻한다. 그리고 전달받은 데이터는 원래 형태로 변환될 수 있는 충분한 내용을 포함하고 있다.

객체 직렬화와 반대로 이 경우에는 역직렬화(deserialization)이라고 하며, ObjectInputStream에 의해 제공된다. ObjectOutputStream가 ObjectInputStream은 객체를 직렬화하고 역직렬화하기 위해서 사용한다.

그리고 ObjectOutputStream은 writeObject() 메소드를 이용해서 객체를 직렬화하며, ObjectInputStream은 readObject() 메소드를 이용해서 객체를 역직렬화하게 된다.