JAVA Clone
우리가 객체를 복사할때 Clone() 을 사용합니다. 하지만 이경우, 객체가 가지고 있는 Sub 객체는 복사되지 않고, 주소 정보만 가지고 있게 됩니다.
hOriginalMap = new HashMap();
hOriginalMap.put("key1", "value1");
hOriSubMap = new HashMap();
hOriSubMap.put("subKey1","subValue1");
hOriginalMap.put("keyObj1", hOriSubMap);
HashMap hNewMap = null;
hNewMap = (HashMap)hOriginalMap.clone();
<<Shallow copy 결과>>
Original Map address=[3526198]
new Map address=[7699183]
Original Sub Map address=[14285251] <== 같은 주소값
new Sub Map address=[14285251] <== 같은 주소값
위에서 hOriginalMap 과 hNewMap 객체는 서로 다른 주소값을 가지게 되지만,
hOriSubMap 객체의 경우에는 같은 주소값을 가지게 되는 것입니다.
이와 같은 복사 방식을 ShallowCopy 라고 합니다.
즉, Clone은 해당 객체에 대해서만 신규 객체는 생성합니다.
Deep Copy
그러면 Sub 객체 까지 새롭게 객체를 생성하려면 어떻게 해야 할까요?
게다가 복작한 계층형 구조로 되어 있다면 어떻게 해야 할까요?
hOriginalMap = new HashMap().put('key1',new HashMap(.put('key2',new HashMap(.put('key3',new HashMap(.put('key4',new HashMap(...)))));
Data Set이 계층형의 복잡한 구조라고 하면, 구조 정보를 파악해서 각각을 복사한다는 것은 쉬운일이 아닙니다. 또한 이러한 Data set이 여러개라면 각각의 Data Set 별로 객체를 복사해서 처리하기는 어렵습니다.
이럴경우, 아래와 같이 최상의 객체를 복사하여 동일 객체를 만들 수 있습니다.
Object => Object OutputStream=> new Object InputStream => new Object
아래는 복사하는 방법입니다.
hNewMap = null;
ByteArrayOutputStream byteArrOs;
ObjectOutputStream objOs;
ByteArrayInputStream byteArrIs;
ObjectInputStream objIs;
Object deepCopy;
HashMap hOriginalMap = new HashMap();
byteArrOs = new ByteArrayOutputStream();
objOs = new ObjectOutputStream(byteArrOs);
objOs.writeObject(hOriginalMap);
byteArrIs = new ByteArrayInputStream(byteArrOs.toByteArray());
objIs = new ObjectInputStream(byteArrIs);
deepCopy = objIs.readObject();
hNewMap = (HashMap)deepCopy;
Object stream을 이용하면 Remote 통신에서 json 등 Plain text 가 아닌 원격지에 동적 java Object를 생성하여 Model 객체를 자동생성 할 수도 있습니다.
복잡한 객체 Deep copy 하느라 고생하지 마세요~~^^;