"안녕, 아미고!"
"안녕, 김."
"clone() 메서드에 대해 알려드리겠습니다."
"이 방법의 요점은 개체를 복제하는 것, 즉 개체의 복제/복사/복제를 생성하는 것입니다."
"이 메소드가 호출되면 JVM(Java Virtual Machine)은 호출된 객체의 복제본을 생성하고 반환합니다.
Object 클래스의 복제 방법 구현은 매우 원시적입니다. 새 객체 하나만 생성되고 원래 객체의 필드 값이 해당 필드에 할당됩니다.
복사된 개체에 다른 개체에 대한 참조가 포함되어 있으면 해당 참조가 복사됩니다. 이러한 개체의 복제본은 생성되지 않습니다."
"흠. 별로 할 말이 없군."
"문제는 JVM(Java Virtual Machine)이 복제할 수 있는 객체와 복제할 수 없는 객체를 모른다는 것입니다. 예를 들어 파일은 복제할 수 없습니다. System.in 스트림도 마찬가지입니다."
"그래서 본격적인 복제에 대한 질문은 클래스의 개발자에게 펀칭되었습니다. "이것은 equals 메소드가 처리되는 방식과 모두 유사합니다. hashCode에 필적할 만한 것도 있습니다: Cloneable 인터페이스."
" Cloneable 인터페이스는 '마커 인터페이스'라고 하는 것입니다. 메서드가 없으며 특정 클래스를 표시하는 데 사용됩니다.
"클래스의 개발자가 클래스의 개체를 복제할 수 있다고 믿는 경우 이 인터페이스로 표시합니다(즉, 클래스가 Cloneable을 구현하도록 함)."
"개발자가 복제 방법의 표준 구현이 마음에 들지 않으면 올바른 방식으로 복제 개체를 생성하는 자신만의 방법을 작성해야 합니다."
" clone () 메서드를 호출하면 Java는 개체가 Cloneable 인터페이스를 지원하는지 확인합니다. 지원하는 경우 clone ( ) 메서드를 사용하여 개체를 복제합니다. 지원하지 않는 경우 CloneNotSupportedException을 발생시킵니다."
"즉, 복제 방법을 재정의하거나 클래스가 Cloneable을 구현하도록 해야 합니까?"
"예, 하지만 여전히 메서드를 재정의해야 합니다. clone() 메서드는 보호된 것으로 선언되므로 해당 패키지(java.lang.*) 또는 하위 클래스의 클래스에서만 호출할 수 있습니다."
"약간 혼란스럽습니다. 개체를 복제하려면 어떻게 해야 합니까?"
"객체 클래스의 «기본» 복제 방법을 사용하려면 다음을 수행해야 합니다.
" a) 클래스에 Cloneable 인터페이스 추가"
" b) 복제 방법을 재정의하고 구현 내에서 슈퍼클래스의 구현을 호출합니다."
class Point implements Cloneable
{
int x;
int y;
public Object clone()
{
return super.clone();
}
}
"또는 복제 방법의 구현을 완전히 직접 작성할 수 있습니다."
class Point
{
int x;
int y;
public Object clone()
{
Point point = new Point();
point.x = this.x;
point.y = this.y;
return point;
}
}
"재미있는 방법이군요. 꼭 사용하겠습니다. 가끔은…"
GO TO FULL VERSION