clone() 은 Object 에 선언되어 있으나, Cloneable 인터페이스가 동작방식을 결정한다.

실제로 클래스 안을 들여다보면 다음과 같이 정의되어 있다:

image.png

그러나 Cloneable 이 clone() 동작 방식을 결정하기 때문에, Clonealbe을 구현한 클래스의 인스턴스에서 clone 을 호출하면 그 객체의 필드들을 복사한 객체를 반환한다. 그렇지 않은 클래스의 인스턴스에서 호출하면, CloneNotSupportedException 을 던진다.

→ 상당히 이례적으로 사용한 예임. 따라하지 말 것.

실무에서 Cloneable을 구현한 클래스는 public 한 clone()을 제공하며, 사용자는 당연히 복제가 제대로 이뤄지리라 기대한다.

clone() 은 객체의 복사본을 생성해 반환한다.

반환된 객체와 원본 객체는 독립적이어야 한다.

// true
x.clone() != x

// true
x.clone().getClass() == x.getClass()

반환하는 객체는 super.clone 을 호출해 얻는다.

// true 지만, 반드시 만족하진 않음
x.clone().equals(x)