clone()
은 Object 에 선언되어 있으나, Cloneable 인터페이스가 동작방식을 결정한다.
실제로 클래스 안을 들여다보면 다음과 같이 정의되어 있다:
그러나 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)