Cloneable
은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다.
clone
메서드는 선언된 곳이 Cloneable
이 아닌 Object
이고, protected
로 되어 있다.
Cloneable
을 구현하는 것만으로는 일부 객체에서 clone
메서드를 호출할 수 없다.Cloneable
방식은 널리 쓰인다!<aside>
💡 그렇다면, 메서드 하나 없는 Cloneable
인터페이스는 대체 무슨 일을 할까?
</aside>
→ 이 인터페이스는 Object
의 protected
메서드인 clone
의 동작 방식을 결정한다!
Cloneable
을 구현한 클래스의 인스턴스에서 clone
을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환한다.
CloneNotSupportedException
을 던진다.실무에서 Cloneable
을 구현한 클래스는 clone
메서드를 public
으로 제공하며, 사용자는 당연히 복제가 제대로 이뤄지지라고 기대한다.
clone
메서드의 일반 규약은 허술하다. → 아래는Object
명세에서 가져온 규약이다.
이 객체의 복사본을 생성해 반환한다.
어떤 객체 x
에 대해 다음 식은 참이다.
x.clone() != x
다음 식도 참이지만, 이상의 요구를 반드시 만족해야 하는 것은 아니다.
x.clone().getClass() == x.getClass()
다음 식도 일반적으로는 참이지만, 필수는 아니다.
x.clone().equals(x)
관례상 이 메서드가 반환하는 객체는 super.clone
을 호출해 얻어야 한다.
x.clone().getClass() == x.getClass()