Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 clone() 메소드의 중요성?

<시간/>

복제() 메소드는 복제 가능 을 구현하는 클래스 개체의 복사본을 만드는 데 사용됩니다. 상호 작용. 기본적으로 필드별 복사 를 수행합니다. Object 클래스는 개체가 이 메서드를 호출하는 특정 클래스의 멤버에 대해 전혀 알지 못하기 때문입니다. 따라서 클래스에 기본 데이터 유형 멤버만 있는 경우 개체의 새 복사본이 생성되고 새 개체 복사본에 대한 참조가 반환됩니다. 그러나 클래스에 클래스 유형의 구성원이 포함되어 있으면 해당 구성원에 대한 개체 참조만 복사되므로 원본 개체와 복제된 개체 모두의 구성원 참조가 동일한 개체를 참조합니다.

CloneNotSupportedException 이 발생합니다. clone()을 호출하려고 하면 복제 가능 을 구현하지 않는 클래스의 개체에 대한 메서드 상호 작용. 이 인터페이스는 마커 인터페이스입니다. 이 인터페이스의 구현은 단순히 Object.clone() 메서드는 구현 클래스의 개체에서 호출할 수 있습니다.

구문

protected Object clone() throws CloneNotSupportedException

두 가지 방법으로 clone() 메서드를 구현할 수 있습니다.

얕은 카피

이는 Object.clone()에서 제공하는 기본 복제 기능의 결과입니다. 클래스에 기본이 아닌 데이터 형식 멤버도 있는 경우 메서드입니다. Shallow Copy의 경우 복제된 개체는 참조된 개체가 아닌 개체 참조만 복사되므로 원본 개체가 참조하는 동일한 개체도 참조합니다.

예시

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("Tutorialspoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
      public String toString() {
         return sb.toString();
      }
   public Object clone() {
      try {
         return super.clone();
      } catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

출력

Welcome to Tutorialspoint!
Welcome to Tutorialspoint!


딥 카피

clone() 을 재정의해야 합니다. Deep Copy를 달성하기 위해 기본이 아닌 유형 멤버가 있는 클래스를 위한 방법 기본 복제 메커니즘에 의해 수행되지 않는 구성원 개체도 복제해야 하기 때문입니다.

예시

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" TutorialsPoint!");
      System.out.println(a1);
      System.out.println(a2);
   }
}
class A implements Cloneable {
   public StringBuffer sb = new StringBuffer("Welcome to ");
   public String toString() {
      return sb.toString();
   }
   public Object clone() {
      try {
         A a = (A) super.clone();
         a.sb = new StringBuffer(sb.toString());
         return a;
      }
      catch(CloneNotSupportedException e) {
      }
      return null;
   }
}

출력

Welcome to TutorialsPoint!
Welcome to