본문 바로가기
JAVA

[JAVA] 값 복사하기 : object클래스의 clone() 메서드

by 정공자씨 2024. 4. 24.

 

object클래스의 clone() 메서드

 

정의

  • object 클래스에 정의된 clone() 메서드
  • 자신을 복사하여 새로운 인스턴스를 생성

 

특징

  • 단순히 인스턴스의 값만 복사함
  • 기본 타입 변수의 경우에는, 값 자체를 복사하기 떄문에
    • 복사한 객체는 별도의 메모리를 가짐(깊은 복사)
  • 참조타입의 변수(참조변수)를 가지는 클래스를 복사하는 경우에는
    • 객체의 주소가 복사되기 때문에
    • 완전한 복사가 이루어지지 않음(얕은 복사)

 

object클래스의 clone()

protected native Object clone() throws CloneNotSupportedException;

 

1. 접근 제한자가 protected

  • 동일한 패키지나 상속 관계가 아니므로, clone() 호출이 불가능
  • 이 메서드를 사용하기 위해서는 오버라이딩하여 재정의 해야함

2. CloneNotSupportedException

  • Cloneable 인터페이스을 구현해줘야 함
  • 이 클래스를 구현하지 않으면 예외를 던져야 함

 

clone() 메서드를 사용하는 방법

class Coffee implements Cloneable {
    String name;
    int price;
}
  • clone() 메서드를 사용하기 위해서는, 복사할 클래스가 cloneable 인터페이스를 구현해야함
  • 해당 인터페이스 내에는 아무런 내용이 없는데
    • Cloneable 인터페이스는, 이것을 구현하는 클래스가 복제가 가능하다는 것을 알려주는 역할

 

class Coffee implements Cloneable {  // 복사할 클래스(Coffee)
    public String name;
    public int price;
    
    Coffee(String name, int price){ // 매개변수 있는 생성자
    	this.name = name;
    	this.price = price;
    }
    
    @Override
    public Object clone() { // clone() 오버라이딩
    	Object obj = null;
        try {
            obj = super.clone();  // object클래스의 clone() 호출
        } catch(CloneNotSupportedException e) {
        
        }
        return obj;    
    }

    @Override
    public String toString() {
        return "Coffee [name=" + name + ", price=" + price + "]";
    }      
}
  • clone() 메서드를 오버라이딩하면서, 메서드의 접근 제어자를 public으로 변경하여 사용

 

public class Test {
    public static void main(String[] args) {
        Coffee coffee = new Coffee("makiatto", 5000);

        // clone()은 object타입을 return, 형변환 필요
        Coffee copy = (Coffee)coffee.clone(); 

        System.out.println(coffee); 
        System.out.println(copy);

        coffee.name = "마끼아또";

        System.out.println(coffee); 
        System.out.println(copy); 
    }
}

 

[ 실행 결과 ]

Coffee [name=makiatto, price=5000]
Coffee [name=makiatto, price=5000]

//coffee(원본)의 name을 바꾼 후의 값 출력
Coffee [name=마끼아또, price=5000]
Coffee [name=makiatto, price=5000]

 

 

clone() 메서드를 이용하여 깊은 복사 하기

  • clone() 메서드를 사용하여 객체를 복사할 때, 얕은 복사를 수행함
  • 객체를 깊은 복사 하고 싶다면, 해당 클래스에 맞게 clone()메서드를 재정의 해줘야 함

 

 

 

출처

https://velog.io/@roro/Java-Object-%ED%81%B4%EB%9E%98%EC%8A%A4-clone