English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java의 clone() 메서드의 중요성은 무엇인가요?

clone() 메서드는 그 클래스를 구현한 객체의 복사본을 생성하는 데 사용됩니다Cloneable의 인터페이스.필드별로 복사합니다. Object 클래스는 특정 클래스의 이 메서드를 호출할 때 객체에 대한 특정 클래스의 멤버에 대해 아무 것도 알지 못합니다. 따라서, 클래스가 원시 데이터 타입 멤버만 가지고 있다면, 객체의 새 복사본을 생성하고 새 객체 복사본에 대한 참조를 반환합니다. 하지만, 클래스가 어떤 클래스 타입의 멤버를 포함하고 있다면, 그 멤버에 대한 객체 참조만 복사합니다. 따라서, 원래 객체와 클론 객체의 멤버 참조는 모두 동일한 객체를 참조합니다.

미구현된Cloneable 인터페이스의 클래스의 객체에서 호출clone()메서드를 호출하면CloneNotSupportedException 이 인터페이스는마크 인터페이스입니다.이 인터페이스는인터페이스의 구현은 해당 클래스의 객체에서 호출할 수 있는Object.clone()메서드를 사용할 수 있습니다.

문법

protected Object clone() throws CloneNotSupportedException

우리는 다음과 같이clone()이 두 가지 방식으로 메서드를 구현할 수 있습니다.

가벼운 복사

이 클래스도 비원시 데이터 타입 멤버가 있으면 이는Object.clone()메서드가 제공하는 기본 복사 기능의 결과는 "가벼운 복사"의 경우에도, 복사된 객체는 여전히 원본 객체가 참조하는 객체를 참조합니다. 이는 객체 참조만 복사되고 객체 자체는 참조되지 않기 때문입니다.

예제

public class ShallowCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append("w3codebox!");
      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 w3codebox!
Welcome to w3codebox!


깊은 복사

비원시 타입 멤버가 있는 클래스에 대해서는 이를 재정의해야 합니다.clone() 메서드를 통해 구현깊은 복사(Deep Copy),그러나 이도 멤버 객체를 복사해야 하며 기본 복사 메커니즘은 이를 수행할 수 없기 때문입니다.

예제

public class DeepCopyTest {
   public static void main(String args[]) {
      A a1 = new A();
      A a2 = (A) a1.clone();
      a1.sb.append(" w3codebox!");
      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 w3codebox!
Welcome to