일반적으로 인터페이스를 구현한다는 것은 해당 인터페이스 기능을 제공한다는 의미인데 Cloneable 인터페이스의 경우 상위 클래스인 Object의 protected 메서드인 clone() 동작 방식을 변경하라는 모순적인 의미를 담고 있다.
Object의 clone() 메서드는 protected 접근 제어자로 선언되어 있어 Cloneable 인터페이스를 구현한다고 하더라도 외부에서 clone() 메서드를 호출할 수 없다. 결국 개발자가 직접 public으로 오버라이드해야 한다.
Object.clone()은 기본적으로 얕은 복사를 수행한다. 객체 내부에 또 다른 객체를 참조하는 필드가 있을 경우, 해당 필드 참조만 복사될 뿐 실제 객체가 복사되지 않는다. 이로 인해 원본 객체와 복사본 객체가 같은 내부 객체를 공유하게 되면서 수정 시 사이드 이펙트가 발생할 수 있다.
완전히 독립적인 객체 복사를 원한다면 개발자가 직접 깊은 복사 로직을 구현해야 한다.
Cloneable 인터페이스는 복잡하고 안전하지 않은 구조적 결함으로 인해 현대 자바 개발에서는 사실상 사장된 기술이다. 배열의 clone() 메서드처럼 특수한 경우를 제외하고는 복사 생성자와 같은 명시적이고 안전한 대안을 사용하는 것이 바람직하다.