Java clone에 관하여
Java의 clone()메서드
clone이란?
- clone()는 객체의 사본 생성을 의미한다.
- 현재 객체 클래스의 새 인스턴스를 만들고, 객체의 해당 필드 내용으로 모든 필드를 초기화합니다.
- Object 클래스 안에 메소드로 있다.
여기서 clone()
접근 제어자는 protected
이다. 이 부분을 잘 봐야한다.
protected
는
- 서로 다른 패키지에서는 호출할 수 없다.
- 서로 다른 패키지라도 상속은 가능하다.
그렇기 때문에 clone()를 사용하려는데 Object클래스가 필요하지만 protected
때문에 다른 패키지에 있는 Object의 clone()메소드를 호출하지 못한다. ㅠㅠ
- 예시
class Animal {
protected String test(){
return "test";
}
}
class Rabbit extends Animal implements Cloneable{
String name;
Rabbit(String name){
this.name = name;
}
}
public class Main{
public static void main(String[] args){
Rabbit rabbit1 = new Rabbit("흰토끼");
rabbit1.test();
}
}
반면에 Object 클래스 안에 다른 메소드는 public
으로 된 것들은 사용할 수 있다.
예) toString, hashcode() … 등등
따라서 Rabbit 클래스에 clone()을 재정의해준다. 재정의 할 때 clone의 접근제어자는 public
으로 바꿔서 접근이 쉽게 가능하게 해준다.
class Rabbit implements Cloneable{
String name;
Rabbit(String name){
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class MainTest{
public static void main(String[] args) {
Rabbit rabbit1 = new Rabbit("흰토끼");
try {
Rabbit rabbit1Copy = (Rabbit) rabbit1.clone();
System.out.println(rabbit1Copy);
System.out.println(rabbit1);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
여기서 Cloneable
은 복제 가능한 클래스라는 것을 JVM에게 알려주기 위한 구분자 역할을 한다. 즉, 복제가 가능한 클래스인지 아닌지 구분해준다.
어떻게 보면 간단한 것이라고 생각할 수 있는 Object의 클래스들은 정말 중요한 내용을 담고 있다.
clone() 메소드 말고도 중요한 메소드가 있는데 이펙티브 자바를 하면서 정리해야겠다.