상속 관계에 있는 두 클래스에서

자식 클래스가 cloneable이기 위해서 부모 클래스도 cloneable이어야만 할까?

그렇지 않다.

Cloneable 인터페이스는 marker interface로서

Cloneable 인터페이스을 구현한 클래스의 clone() 메소드가 유효함을 의미한다.

따라서, Cloneable 인터페이스를 구현한 클래스는

자신만의 clone() 메소드를 갖고 있어야만 한다.

물론, 클래스가 기본형 데이터만으로 이루어진 경우 shallow copy만으로 충분하므로

메소드의 access modifier만 protected에서 public으로 변경해주고,

super.clone()을 반환해도 된다.

하지만 그 이외의 경우 deep copy를 수행하여야만 하므로

자신만의 clone() 메소드를 구현해야만 한다.

다음은 Cloneable 인터페이스를 구현하지 않은 Aminal 클래스를 상속하고,

Cloneable 인터페이스를 구현하는 Dog 클래스의 객체를 clone하는 예제이다.



소스

package clone;

public class Animal {
 private int id;

 public Animal(int id) {
  this.id = id;
 }

 public int getId() {
  return id;
 }
}

package clone;

public class Dog extends Animal implements Cloneable {
 private String name;

 public Dog(int id, String name) {
  super(id);

  this.name = name;
 }

 public String getName() {
  return name;
 }
 
 @Override
 public Object clone() throws CloneNotSupportedException {
  return super.clone();
 }
}

package clone;

public class CloneTest {
 public static void main(String[] args) throws CloneNotSupportedException {
  Dog dog = new Dog(1, "Dog 1");
  Dog clonedDog = (Dog)dog.clone();
 
  System.out.println(clonedDog.getId());
  System.out.println(clonedDog.getName());
 }
}



실행결과


1
Dog 1




Dog 클래스는 기본형 데이터만으로 이루어져 있으므로

super.clone() 메소드 호출만으로 충분함에 주목하기 바란다.

Posted by izeye

댓글을 달아 주세요