clone( )
이 메서드는 자신을 복제하여 새로운 인슽컨스를 생성하는 일을 한다.
어떤 인스턴스에 대해 작업을 할 때, 원래의 인스턴스는 보존하고 clone메서드를 이용해서 새로운 인스턴스를 생성하여 작업을 하면 작업이전의 값이 보존되므로 작업에 실패해서 원래의 상태로 되돌리거나 변경되기 전의 값을 참고하는데 도움이 된다.
import lombok.AllArgsConstructor;
import lombok.ToString;
public class CloneEx1 {
public static void main(String[] args) throws CloneNotSupportedException {
Target t1 = new Target(1, 2, new int[] {5, 6, 7});
Target t2 = (Target)t1.clone();
t1.x = 10;
t1.arr[0] = 50;
System.out.println(t1);
System.out.println(t2);
// int[] arr1 = {1, 2, 3};
// int[] arr2 = arr1.clone();
//
// arr1[0] = 10;
// System.out.println(Arrays.toString(arr1));
// System.out.println(Arrays.toString(arr2));
// invoke 간접적 호출
}
}
@AllArgsConstructor
@ToString
class Target implements Cloneable{
int x;
int y;
int[] arr;
@Override
public Target clone() {
Target obj = null;
try {
obj = (Target)super.clone();
obj.arr = arr.clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
// // clone은 protect라 오버라이드 해야함
// @Override
// public Object clone() throws CloneNotSupportedException { // 접근제어자를 public으로 변경
// // TODO Auto-generated method stub
// return super.clone();
// }
}
얕은 복사와 깊은 복사
clone()은 단순히 객체에 저장된 값을 그대로 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하지 않는다.
객체배열을 clone()으로 복제하는 경우에는 원본과 복제본이 같은 객체를 공유하므로 완전한 복제라고 보기 어렵다.
이러한 복제를 '얕은 복사(shallow copy)'라고 한다.
얕은 복사에서는 원본을 변경하면 복사본도 영향을 미친다.
반면에 원본이 참조하고 있는 객체까지 복제하는 것을 '깊은 복사(deep copy)'라고 하며,
깊은 복사에서는 원본과 복사본이 서로 다른 객체를 참조하기 때문에 원본의 변경이 복사본에 영향을 미치지 않는다.
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Card card = new Card();
Class c1 = card.getClass();
Class c2 = Card.class;
Class c3 = Class.forName("a220128.Card");
Card card2 = (Card) c1.newInstance();
System.out.println(card2);
System.out.println(c2);
System.out.println(c2.getSuperclass());
Method[] methods = c3.getDeclaredMethods();
for(Method m : methods) {
System.out.println(m.getName());
}
String s1 = "a"; // 0x100
String s2 = "b"; // 0x200
String s3 = "c"; // 0x300
String str = s1 + s2 + s3; // 0x400
String s4 = "b"; // 0x200
String s5 = "abc"; // 0x400
}
}
으음...
어디에 뭘 써야할지 아직 감이 안잡히는...
공식문서를 참고하는 습관 중요!!
저는 공식문서를 참고해서 작성했어요~ 하면 됩니다 ㅎㅎ
https://docs.oracle.com/javase/8/docs/api/
Deprecated 중요도가 떨어져 더 이상 사용되지 않음
되도록이면 사용하지마세요!!!
이렇게 취소선이 보여요
메서드 요약에 보면
이렇게 구분하면 됩니다!!
댓글