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
'JAVA' 카테고리의 다른 글
[JAVA] Object.equals()와 String.equals(), ==연산자 (0) | 2024.04.24 |
---|---|
[JAVA] StringBuffer클래스, StringBuilder클래스 (0) | 2024.04.24 |
[JAVA] 깊은 복사, 얕은 복사 (0) | 2024.04.24 |
[JAVA] 익명 클래스(익명 객체) (0) | 2024.04.23 |
[JAVA] 중첩 클래스의 종류, 특징 (0) | 2024.04.23 |