Contents
Java clone에 관하여
   Dec 30, 2022     2 min read

Java의 clone()메서드

clone이란?

  • clone()는 객체의 사본 생성을 의미한다.
  • 현재 객체 클래스의 새 인스턴스를 만들고, 객체의 해당 필드 내용으로 모든 필드를 초기화합니다.
  • Object 클래스 안에 메소드로 있다.

Untitled

Untitled 1

여기서 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() … 등등

Untitled 2

따라서 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() 메소드 말고도 중요한 메소드가 있는데 이펙티브 자바를 하면서 정리해야겠다.