객체를 복사하는 과정에서 "얕은 복사(Shallow Copy)"와 "깊은 복사(Deep Copy)"는 중요한 개념입니다.
이 두 복사 방법은 객체의 복사본을 생성할 때 내부의 값들이 어떻게 처리되는지에 대한 차이를 가지며, 이는 프로그래밍에서 데이터 관리와 메모리 관리의 핵심적인 부분입니다.
얕은 복사는 객체의 복사본을 생성할 때 객체의 최상위 수준의 값만 복사하는 방법입니다.
객체 내부에 다른 객체에 대한 참조가 있다면, 이 참조들은 원본 객체와 복사된 객체 간에 공유됩니다.
즉, 내부 객체에 대한 실제 복사본은 생성되지 않습니다.
class Person {
String name;
int age;
List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
// 얕은 복사를 수행하는 메서드
public Person shallowCopy() {
return new Person(this.name, this.age, this.hobbies);
}
}
public class ShallowCopyExample {
public static void main(String[] args) {
List<String> hobbies = new ArrayList<>(Arrays.asList("Reading", "Coding"));
Person original = new Person("John", 30, hobbies);
Person copied = original.shallowCopy();
copied.hobbies.add("Hiking");
System.out.println(original.hobbies); // 출력: [Reading, Coding, Hiking]
System.out.println(copied.hobbies); // 출력: [Reading, Coding, Hiking]
}
}
이 예시에서, Person
객체의 복사본을 생성할 때 hobbies
리스트는 원본 객체와 복사된 객체 간에 공유됩니다.
따라서 한 객체에서 hobbies
리스트를 변경하면 다른 객체에도 영향을 미칩니다.
깊은 복사는 객체의 복사본을 생성할 때 객체 내부의 모든 값들을 재귀적으로 복사하는 방법입니다.
이는 객체 내부의 참조된 모든 객체에 대해 새로운 복사본을 생성하며, 결과적으로 원본 객체와 복사된 객체 사이에는 완전한 독립성이 보장됩니다.
class Person {
String name;
int age;
List<String> hobbies;
public Person(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = new ArrayList<>(hobbies);
}
// 깊은 복사를 수행하는 메서드
public Person deepCopy() {
return new Person(this.name, this.age, new ArrayList<>(this.hobbies));
}
}
public class DeepCopyExample {
public static void main(String[] args) {
List<String> hobbies = new ArrayList<>(Arrays.asList("Reading", "Coding"));
Person original = new Person("John", 30, hobbies);
Person copied = original.deepCopy();
copied.hobbies.add("Hiking");
System.out.println(original.hobbies); // 출력: [Reading, Coding]
System.out.println(copied.hobbies); // 출력: [Reading, Coding, Hiking]
}
}
이 예시에서는 Person
객체의 깊은 복사본을 생성할 때 hobbies
리스트에 대한 새로운 복사본을 만듭니다.
따라서 원본 객체와 복사된 객체는 완전히 독립적으로 작동합니다.
얕은 복사와 깊은 복사는 객체를 복사할 때 고려해야 할 중요한 개념입니다.
얕은 복사는 복사 속도는 빠르지만, 원본 객체와 복사된 객체 사이에 데이터 공유 문제가 발생할 수 있습니다.
반면, 깊은 복사는 완전한 독립성을 제공하지만, 복사 과정이 더 복잡하고 시간이 더 걸립니다.
참조 : https://zzang9ha.tistory.com/372
https://velog.io/@y_jem/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC%EC%99%80-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC
https://choiblack.tistory.com/41