"Cloneables"은 "clone"을 구현해야 합니다

 

단순히 Cloneableimplements한다고 클래스를 클론할 수 있는게 아닙니다. Object.clone()을 오버라이딩 해주어야합니다. Cloneable 인터페이스의 clone 메소드를 어떻게 구현해야 하는지는 정해진 바가 없지만, 일반적으로 진정한 의미의 복제 가능성을 보장할 수 있도록 구현합니다. 그렇지 않으면 JVM clone이 사용됩니다. 기본 JVM clone은 원본 객체에서 primitive타입 값을 복사하고, 원본 객체가 객체를 갖는 경우 객체 참조를 복사하는 clone 을 의미합니다. 즉 JVM clone이 사용될 경우, 복제된 인스턴스들과 원본 인스턴스가 멤버 객체를 참조 공유할 수 있습니다.

역자 참조: “기본으로 제공되는 clone은 shallow copy니까 deep copy로 오버라이딩해라”라는 의미로 보입니다.

다른 방법으론 Cloneable을 사용하지 않고, copy 생성자를 제공하는 방법이 있습니다. 이 방법도 클래스를 복사하는데 사용할 수 있는 좋은 방법 중 하나입니다.

규칙을 어긴 코드

class Team implements Cloneable {  // 규칙을 어긴 코드
  private Person coach;
  private List<Person> players;
  public void addPlayer(Person p) {...}
  public Person getCoach() {...}
}

규칙을 준수한 해결책

class Team implements Cloneable {
  private Person coach;
  private List<Person> players;
  public void addPlayer(Person p) { ... }
  public Person getCoach() { ... }

  @Override
  public Object clone() {
    Team clone = (Team) super.clone();
    //...
  }
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project