Cloneable 은 복제해도 되는 클래스임을 명시하는 용도인 믹스인 인터페이스(아이템 20)지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable 이 아닌 Object 이고, 그마저도 protected 라는 데 있다. 이번 아이템에서는 clone 메서드를 잘 동작하게끔 해주는 구현 방법과 언제 그렇게 해야 하는지를 알려주고, 가능한 다른 선택지에 관해 논의하겠다.

메서드 하나 없는 Cloneable 인터페이스는 대체 무슨 일을 할까? 이 인터페이스는 놀랍게도 Object 의 protected 메서드인 clone 의 동작 방식을 결정한다. Cloneable 을 구현한 클래스의 인스턴스에서 clone 을 호출하면 그 객체의 필드들을 하나하나 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하면 CloneNotSupportedException 을 던진다. 이는 인터페이스를 상당히 이례적으로 사용한 예이니 따라 하지는말자. 인터페이스를 구현한다는 것은 일반적으로 해당 클래스가 그 인터페이스에서 정의한 기능을 제공한다고 선언하는 행위 다. 그런데 Cloneable 의 경우에는 상위 클래스에 정의된 protected 메서드의 동작 방식을 변경한 것이다.