우리가 객체를 복사할때 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 라고 합니다.
그러면 Sub 객체 까지 새로운 메모리 주소로 복사를 하기 위해서는
hOriginalMap 객체 또한 Clone 해서 hNewMap 에 담아 줘야만 Sub 객체를 포함해서
복사를 할 수 있는 것입니다.
하지만 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 하느라 고생하지 마세요~~^^;
'Java' 카테고리의 다른 글
IE11 관련 Javascript 수정사항 (0) | 2017.03.06 |
---|---|
java 소켓 연결 Timeout 설정 (0) | 2017.02.01 |