1. clone()
clone() 메소드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 합니다. 기존의 인스턴스의 값은 보존하고 새로운 인스턴스를 만들어서 이 인스턴스를 이용해서 작업을 진행하면 편리한 경우가 종종 있습니다. 예를들어서 파라미터로 값을 넘겨야하는데, 이 인스턴스의 멤버변수의 값을 변경해야할 경우 기존 인스턴스가 변경될때 다른 코드에 영향을 줄 수 있으므로 이때 clone()을 사용하면 좋을꺼 같습니다.
2. clone() 예제 코드
clone()은 모든 클래스의 부모인 Object 클래스에 정의되어있습니다. 여기에 정의된 clone()은 단순히 인스턴스 변수의 값만을 복하기 때문에 참조 타입의 인스턴스 변수가 있는 클래스는 완전한 복제가 이루어지지 않습니다. 따라서 복제된 참조타입의 인스턴스 변수에 대한 작업이 원본의 인스턴스에 영향을 미치게 됩니다. 이런 경우 clone 메소드를 오버라이딩해서 새로운 객체를 만들어줍니다.
clone()을 사용하려면 Cloneable 인터페이스를 구현해야하고, clone()을 오버라이딩합니다. Cloneable인터페이스를 구현한다는 것은 클래스 작성자가 복제를 허용한다는 의미입니다. 접근 제어자는 protected에서 public으로 변경합니다. 그래야 상속관계가 없는 다른 클래스에서 clone을 호출할 수 있습니다. 그리고 clone을 호출하는 코드가 포함된 try-catch문을 작성해야합니다.
public class Point implements Cloneable {
private int x;
private int y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
@Override
public String toString(){
return "x=" + x + ", y=" + y;
}
@Override
public Point clone(){
Object obj = null;
try{
obj = super.clone();
} catch (CloneNotSupportedException e){
e.printStackTrace();
}
return (Point) obj;
}
}
Main 클래스를 작성해서 결과를 확인해봅니다.
public class Main {
public static void main(String[] args){
Point p1 = new Point(1,3);
Point p2 = (Point)p1.clone();
System.out.println(p1.toString());
System.out.println("p1 hashCode : " + p1.hashCode());
System.out.println(p2.toString());
System.out.println("p2 hashCode : " + p2.hashCode());
}
}
값은 똑같이 복제 되었고, hashCode가 다른것을 확인할 수 있습니다.
x=1, y=3
p1 hashCode : 460141958
x=1, y=3
p2 hashCode : 1163157884
'Java' 카테고리의 다른 글
[Java] Comparable과 Comparator을 이용한 정렬 (0) | 2020.07.19 |
---|---|
[Java] 자바 Collection (0) | 2020.06.14 |
[Java-source quality] Redundant Modifier (0) | 2020.05.29 |
[Java] JAVA API 도큐먼트 (0) | 2020.04.03 |
[Java] 제네릭(Generic) (0) | 2020.03.31 |