본문 바로가기

Better SW Development

[dW Review] 마커 인터페이스와 객체 그래프 : 자바 객체 직렬화(Java Object Serialization)를 배우기전에 알면 좋은 사전지식

Java Object Serialization에 대해 모르고 있던 5가지 사항
http://www.ibm.com/developerworks/kr/library/j-5things1/index.html

자바에서 인스턴스화 된 객체를 전달하는 가장 흔한 방법은 직렬화(Serialization)이다. 직렬화를 할 때 유용한 몇 가지 이야기를 위 기사에서 하고 있다. 언제나와 마찬가지로 제대로 이해하기 위해서는 몇 가지 지식을 미리 알고 있어야 한다.

마커 인터페이스
Marker Interface
자바에서 객체 직렬화는 Serializable 이라는 인터페이스를 implements 하면 된다. 그런데 이 인터페이스는 구현해야 할 메소드가 하나도 없다. 단지, 객체가 직렬화 대상임을 알려주는 일종의 마커(Marker) 역할을 한다. 그래서 이렇게 메소드를 하나도 가지지 않는 인터페이스를 마커인터페이스(Marker Interface)라 부른다. - 혹자는 태그(tag)인터페이스라고 부르기도 한다. -
마커 인터페이스에는 이 외에도 Cloneable, EventListener 등이 있다. 그럼 왜 이런 인터페이스를 만드는 걸까? 아니, 이런 인터페이스를 만들면 어떻게 하겠다는 뜻일까?

대부분의 경우 특정 작업을 하기 전에 해당 타입을 체크하는 용도로 사용된다.

이를 테면 객체를 복제하는 작업을 하려면 Cloneable인터페이스를 마커인터페이스로 지정해 놓아야 한다. 실제 클론 메소드가 호출되는건 Object 클래스내에 들어 있다. 해당 인터페이스의 타입이 아닐경우 예외가 발생한다.
class Object{
...
     protected Object clone() throws CloneNotSupportedException {

          if (!(this instanceof Cloneable)) {
              throw new CloneNotSupportedException(
                      "Doesn't implement Cloneable interface!");
          }
          return VMMemoryManager.clone(this);
      }
...
마커 인터페이스는 위와 같은 식으로 사용된다.

객체 그래프
Object Graph

객체 그래프란 특정 시점에 객체들의 참조 관계를 나타낸 모습을 지칭한다. 직렬화를 할때는 참조되는 객체들도 참조 그래프에 따라 함께 직렬화가 일어난다. 일종의 직렬화의 전파(propagation)현상이 발생하는 셈이다. 따라서 직렬화 개념을 이해하려면 객체 그래프도 이해해야 한다.