JAVA 41. Cloneable Interface (2)
내용 코드 원본 (JDK 구버전) : 객체 클로닝에 관하여 - javacan
Cloneable
Interface (2)
단순 클로닝 구현
public class MyClass implements Cloneable {
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
위와 같은 cloning의 경우, shallow cloning이라 부르며, 객체 레퍼런스가 아닌 단순 필드에 대한 클로닝에만 작동한다.
clone()
메소드의 필수 요소
Cloneable
인터페이스 : clone()
메소드를 제공하기 위한 Cloneable
인터페이스를 상속해야함.
Object
클래스에서 구현된 clone
메소드 : 객체의 모든 필드를 복사
CloneNotSupportedException
클래스 : 클래스의 clone()
메소드가 지원되지 않을 경우를 위한 예외 클래스.
이 예외는 실행 시 발생하는 예외로 컴파일 시에는 발견되지 않음.
Object.clone()
메소드 : 객체의 복사본을 생성하여 반환. 즉, x.clone() != x
배열을 포함한 객체 클로닝
deep cloning이 필요한 부분
public class MyArrayClass implements Cloneable {
private int[] numbers = null;
public MyArrayClass() {
numbers = new int[10];
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
이 객체의 clone()
의 경우, 객체의 복사본을 만드나 새로운 배열을 생성하지 않고 원본에서 생성된 배열을 공유함.
따라서 clone()
부분을 다음과 같이 바꾸어 주어야 함.
public Object clone() throws CloneNotSupportedException {
MyArrayClass myObj = (MyArrayClass)super.clone();
myObj.numbers = (int[])numbers.clone();
return myObj;
}
객체 레퍼런스를 포함한 객체 클로닝
deep cloning이 필요한 부분
public class MyReferenceClass implements Cloneable {
private MyData data = null;
public MyReferenceClass() {
data = new MyData();
}
public Object clone() throws CloneNotSupportedException {
MyReferenceClass myObj = (MyReferenceClass)super.clone();
myObj.data = (MyData)data.clone();
return myObj;
}
}
단, 이 클로닝이 되기 위해서는 MyData
클래스가 클로닝이 보장되어야 한다.
Collection을 포함한 객체 클로닝
public class MyCollectionClass implements Cloneable {
private Vector vector = null;
public MyCollectionClass() {
vector = new Vector();
}
public Object clone() throws CloneNotSupportedException {
MyCollectionClass myObj = (MyCollectionClass)super.clone();
myObj.vector = (Vector)vector.clone();
return myObj;
}
}
Collection
계열의 객체들은 클로닝을 지원하므로 clone()
메소드를 이용한 클로닝 구현 가능
Comments