728x90
자바의 Copy by Reference 개념을 이해하기 위해서 만든 코드임.
또한, 깊은 복사를 이용한 결과 값을 보이는 예제도 함께 구현함.
MyObject의 deep clone 구현에서는 wildcard type을 적용함.
MyOject 를 상속한 MyObjectExt에 적용될 수 있는 사항도 포함하고 있음.
deep clone의 경우에는 MyObject를 상속한 모든 클래스에 대해서 deep clone을 수행할 수 있도록 한다. deep clone시에는 MyObject의 필드 정보에 대해서만 clone을 수행하지만, reflection 정보를 확장해서 더욱 기능을 높일 수 있다.
package application;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by Yuseok on 2015-12-03.
*/
public class RefCopyEx
{
public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException
{
List<MyObject> intList = new ArrayList<MyObject>();
List<MyObject> intList2;// = new ArrayList<MyObject>();
List<MyObject> intListClone;// = new ArrayList<MyObject>();
intList2 = intList;
intList.add(new MyObject(3));
intList.add(new MyObject(6));
intList.add(new MyObject(7));
System.out.println("Do swapping ");
swapItr(intList);
System.out.println("intList Result");
for (MyObject val : intList)
{
System.out.println(val.mySize);
}
System.out.println("intList2 Result");
for (MyObject val : intList2)
{
System.out.println(val.mySize);
}
intListClone = (List<MyObject>) MyObject.cloneMyObject(intList);
swapGet(intListClone);
System.out.println("Do swapping ");
System.out.println("intListClone Result");
for (MyObject val : intList)
{
System.out.println(val.mySize);
}
System.out.println("intListClone Result");
for (MyObject val : intListClone)
{
System.out.println(val.mySize);
}
List<MyObjectExt> intListExt = new ArrayList<MyObjectExt>();
List<MyObjectExt> intListExtClone;// = new ArrayList<MyObjectExt>();
intListExt.add(new MyObjectExt(30));
intListExt.add(new MyObjectExt(35));
intListExt.add(new MyObjectExt(37));
intListExtClone = (List<MyObjectExt>) MyObject.cloneMyObject(intListExt);
swapGet(intListExtClone);
System.out.println("Do swapping ");
System.out.println("intListExt Result");
for (MyObjectExt val : intListExt)
{
System.out.println(val.mySize);
}
System.out.println("intListExtClone Result");
for (MyObjectExt val : intListExtClone)
{
System.out.println(val.mySize);
}
}
// list get과 Iterator 두가지 방식을 이용한 객체 접근 방법 비교
// 동일한 결과를 수행.
public static void swapItr(List<? extends MyObject> list)
{
Iterator<MyObject> itr = (Iterator<MyObject>) list.iterator();
MyObject val;
while(itr.hasNext())
{
val = itr.next();
val.mySize = 5;
}
}
public static void swapGet(List<? extends MyObject> list)
{
MyObject val;
for(int j = 0; j < list.size(); j++)
{
val = list.get(j);
val.mySize = 10;
}
}
}
class MyObjectExt extends MyObject
{
public MyObjectExt(int mySize)
{
super(mySize);
}
}
class MyObject
{
public int mySize;
public MyObject(int mySize)
{
this.mySize = mySize;
}
@Override
protected MyObject clone() throws CloneNotSupportedException
{
MyObject cloned = (MyObject) super.clone();
return cloned;
}
// 깊은 복사를 이용한 list 반환
// unbound wildcard 적용
// return 되는 객체는 매개변수와 동일한 객체를 갖는 list collection 객체로 return 된다.
// 사용시에는 (List<MyObject>) MyObject.cloneMyObject(intList) , (List<MyObjectExt>) MyObject.cloneMyObject(intList) 와 같이 cast한 후에 사용한다.
public static List<? extends MyObject> cloneMyObject(List<? extends MyObject> list) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException
{
Class clazz = list.get(0).getClass();
Constructor constructors = clazz.getDeclaredConstructor(Integer.TYPE);
List<MyObject> clonedList = new ArrayList<MyObject>();
for (MyObject clone : list)
{
clonedList.add((MyObject)constructors.newInstance(clone.mySize));
}
return clonedList;
}
}
728x90
728x90