참조형 변수끼리 대입(a = b)하면 참조 복사가 되기 때문에 같은 대상을 가르킴
어떤 객체의 참조 복사가 아닌 값복사, 그러니까 독립적인 사본을 만들때는 clone() 메서드를 사용 완전한 사본을 만들어 복사본을 리턴
package chapter20230831;
class Point { // 원점을 의미하는 Point 클래스
int x;
int y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public String toString() {
return "x = " + x + " , " + "y = " + y;
}
}
class Circle implements Cloneable { // 객체를 복제헤도 된다는 의미로 Cloneable 인터페이스를 구현
// Cloneable을 구현해야 복제가능
Point point;
int radius;
Circle(int x, int y, int radius) {
point = new Point(x, y);
this.radius = radius;
}
@Override
public String toString() {
return "원점은 " + point + "이고, " + "반지름은 " + radius + "입니다.";
}
@Override
public Object clone() throws CloneNotSupportedException { // clone()메서드를 사용할 때 발생할 수 있는 오류를 예외 처리함
return super.clone();
}
}
public class Clone {
public static void main(String[] args) throws CloneNotSupportedException {
/*
Object clone() : 객체를 복제하여 동일한 멤버 변수를 가진 인스턴스를 생성
객체를 복제해 또 다른 객체를 반환
객체 원본을 유지해 놓고 복사본을 사용한다거나, 기본 틀 (prototype) 의 복사본을 사용해 동일한 인스턴스를 만들어 복잡한 생성과정을 간단히 하려는 경우 사용
*/
// clone() 메서드로 인스턴스 복제하기
Circle circle = new Circle(10, 20, 30);
Circle copyCircle = (Circle)circle.clone(); // clone() 메서드를 사용해 circle 인스턴스를 copyCircle에 복제함
// 값은 동일
System.out.println(circle); // 원점은 x = 10, y = 20이고 반지름은 30 입니다
System.out.println(copyCircle); // 원점은 x = 10, y = 20이고 반지름은 30 입니다
// 주소값은 다름
System.out.println(System.identityHashCode(circle)); // 868693306
System.out.println(System.identityHashCode(copyCircle)); // 1746572565
}
}