clone() : 자신을 복제하여 새로운 인스턴스를 생성
- 원래의 값을 보존하거나,
- 작업에 실패해서 원래의 상태로 되돌리거나,
- 변경되기 전의 값을 참고 시 도움된다.
Object클래스에 정의된 clone()은 단순히 인스턴스변수의 값만 복사한다.
→ 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.
ex) 배열을 clone()하는 경우 복제된 인스턴스도 같은 배열의 주소를 갖게되므로 clone()한 작업이 원본에 영향을 미치게 된다.
해결방법 : clone()을 오버라이딩해서 새로운 배열을 생성 후, 배열의 내용들을 복사해야 한다
clone() 사용순서
- Cloneable 인터페이스를 구현한다.
- 접근 제어자를 protected에서 public으로 변경한다.
→ 접근제어자가 public으로 변경되어야 상속관계가 없는 다른 클래스에서 clone() 호출 가능 - try-catch내에서 조상 클래스의 clone()을 호출한다.
class Point implements Cloneable { // 1.Cloneable 인터페이스를 구현한다.
// Clonealbe인터페이스를 구현한 클래스에서만 clone()을 호출할 수 있다.
// 이 인터페이스를 구현하지 않고 clone()만 호출하면 예외가 발생한다. (이유: 인스턴스의 데이터를 보호하기 위해서)
// Cloneable인터페이스가 구현되어 있다는 것은 클래스 작성자가 복제를 허용한다는 의미
int x,y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "x=" + x + ", y=" + y;
}
public Object clone() { // 2.접근제어자를 protected에서 public으로 변경
Object obj = null;
try { // clone()은 반드시 예외처리를 해주어야 한다.
obj = super.clone(); // 3.try-catch내에서 조상클래스의 clone()을 호출
} catch (CloneNotSupportedException e) { }
return obj;
}
}
public class Ex9_7 {
public static void main(String[] args) {
Point original = new Point(3, 5);
Point copy = (Point) original.clone(); // 복제(clone)해서 새로운 객체를 생성
System.out.println(original);
System.out.println(copy);
}
}
//실행결과
//x=3, y=5
//x=3, y=5
출처 : Java의 정석(남궁성)
'JAVA' 카테고리의 다른 글
java.lang패키지 - Object클래스(hashCode()) (0) | 2023.05.19 |
---|---|
java.lang패키지 - Object클래스(equals()) (0) | 2023.05.02 |
애너테이션(annotation) (0) | 2022.12.19 |
열거형(enum) (0) | 2022.12.19 |
컬렉션 프레임웍(collections framework) (0) | 2022.12.19 |