개발
자바에서의 깊은 복사와 얕은 복사 이해하기
hes3518
2024. 11. 17. 19:46
728x90
반응형
자바 Object Clone: 깊은 복사와 얕은 복사의 이해
안녕하세요! 프로그래밍에 관심이 많은 여러분, 오늘은 Java에서 Object Clone을 사용하는 방법과 그 개념에 대해 알아보겠습니다. 특히, 깊은 복사(deep copy)와 얕은 복사(shallow copy)의 차이와 사용 방법을 설명하고, 간단한 예제를 통해 이해를 돕겠습니다.
들어가며
Java에서 객체를 복제하는 것은 많이 쓰이는 기능 중 하나입니다. 객체 생성 시 메모리를 효율적으로 사용하거나 특정 객체의 상태를 보존하기 위해 복제 기능은 필수적입니다. 그러나 깊은 복사와 얕은 복사를 혼동하면 의도한 대로 동작하지 않을 수 있습니다. 따라서 이 둘의 정확한 개념을 이해하는 것이 중요합니다.
Clone 메소드의 이해
Java에서 객체를 복제하기 위해 사용하는 메소드가 바로 clone()
입니다. 이 메소드는 객체가 스스로를 복사할 수 있도록 도와줍니다. 그러나 몇 가지 주의할 점이 있습니다:
- Cloneable 인터페이스 구현:
clone()
메소드를 사용하려면 클래스에서Cloneable
인터페이스를 구현해야 합니다. - 얕은 복사와 깊은 복사: 기본적으로
clone()
메소드는 얕은 복사를 수행합니다. 즉, 기본 타입 필드는 복사되지만, 객체 타입 필드는 참조만 복사됩니다.
깊은 복사 vs 얕은 복사
- 얕은 복사 (Shallow Copy): 객체의 필드들만을 복사하며, 참조형 필드의 경우 원본 객체와 복제된 객체가 동일한 인스턴스를 참조합니다. 이로 인해 하나의 객체에서 필드 값을 변경하면 다른 객체에도 영향을 미칠 수 있습니다.
- 깊은 복사 (Deep Copy): 객체의 모든 필드를 복사하며, 참조형 필드도 새로운 인스턴스를 생성하여 복사합니다. 따라서 두 개의 객체는 서로 독립적으로 동작할 수 있습니다.
예제 코드
이제 실제 코드를 통해 클론 메소드의 사용을 살펴보겠습니다.
class MyClass implements Cloneable {
private int number;
private String text;
public MyClass(int number, String text) {
this.number = number;
this.text = text;
}
// clone() 메서드 오버라이딩
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public int getNumber() {
return number;
}
public String getText() {
return text;
}
public void setNumber(int number) {
this.number = number;
}
public void setText(String text) {
this.text = text;
}
}
public class Main {
public static void main(String[] args) {
MyClass original = new MyClass(10, "Hello");
try {
// 객체 복제
MyClass cloned = (MyClass) original.clone();
// 복제된 객체의 상태 변경
cloned.setNumber(20);
cloned.setText("World");
// 원본 객체와 복제된 객체의 상태 비교
System.out.println("Original: " + original.getNumber() + ", " + original.getText());
System.out.println("Cloned: " + cloned.getNumber() + ", " + cloned.getText());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
이 코드의 설명
MyClass
라는 클래스는Cloneable
인터페이스를 구현하고clone()
메소드를 오버라이드하여 기본적인 객체 복제를 수행합니다.Main
클래스에서 원본 객체를 생성하고clone()
메소드를 통해 복제된 객체를 만든 후, 복제된 객체의 필드를 변경합니다.- 마지막으로 원본과 복제된 객체의 상태를 비교하여 독립성을 확인합니다.
마무리
이번 포스트에서는 Java에서의 객체 복제에 대해 깊이 있게 알아보았습니다. 깊은 복사와 얕은 복사를 이해함으로써 복잡한 데이터 구조를 다룰 때 발생할 수 있는 문제를 예방할 수 있습니다. 이 정보를 통해 여러분의 프로그래밍 프로젝트에 도움이 되기를 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 질문해 주세요.
감사합니다! 다음 포스트에서 더 많은 정보로 찾아뵙겠습니다.
728x90
반응형