Java ‐ clone 재정의는 주의해서 진행하라[Effective Java Item 13] - dnwls16071/Backend_Summary GitHub Wiki

clone 재정의는 주의해서 진행하라

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