
clone이 뭘까...? git clone도 아니고.
복제해도 되는 클래스임을 명시하는 믹스인 인터페이스
💡믹스인 : 다른 클래스의 부모클래스가 되지 않으면서 다른 클래스에서 사용할 수 있는 메서드를 포함하는 클래스
'상속' 이 아닌 '포함'
clone메소드: 원본 객체의 필드 값과 동일한 값을 가지는 새로운 객체를 생성해주는 메소드
clone 메소드를 사용하기 위해서는 해당 클래스에서 Cloneable 인터페이스를 구현해야 사용할 수 있다.
일반적인 사고라면? Cloneable 인터페이스에 clone 메소드가 있겠지라고 생각하겠지만 아님!!!!!
clone 메소드가 있는 곳은 Object이고, protected이며, Override 해주어야만 사용 가능하다.
Cloneable 인터페이스는 Object의 clone 메소드의 동작 방식을 결정한다.
객체를 복사할 지, CloneNotSupportedException으로 던질지를 결정
clone 메소드는 모든 클래스에서 오버라이딩 할 수 있다.Cloneable 인터페이스를 구현한 클래스만 사용 가능하다.Cloneable 은 상위 클래스 Object에 정의된 clone() 의 동작방식을 변경한다는 의미이다.x.clone() != xx.clone().getClass() == x.getClass()x.clone().equals(x)clone()은 super.clone() 을 통해 객체를 얻어서 반환한다.Cloneable 을 구현하면, clone() 을 재정의해야 한다.public, 반환형은 자기자신의 타입으로 변경한다.super.clone() 으로 복제 한다.배열만이 clone()을 제대로 사용하는 유일한 예이다.
복사하는 대상이 배열이 아니라면 복사 생성자, 복사 팩터리가 더 좋다.
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack(Stack s) {
this.elements = s.elements.clone();
this.size = s.size;
}
}
public class Stack {
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public static Stack newInstance(Stack s) {
return new Stack(s.elements, s.size);
}
}
🎈귀중한 참고자료🎈
참고자료1