배열의 깊은 복사(Deep Copy) , 얕은 복사 (Shallow Copy)
자바에서는 객체를 복사할 때, 2가지 방법을 사용한다.
깊은 복사(Deep Copy)와 얕은 복사 (Shallow Copy)가 있는데 객체가 참조하는 다른 객체들을 어떻게 다루는지에 따라서 달라진다.
1. 깊은 복사(Deep Copy) :
깊은 복사는 원본과 복사본 둘 중 한가지의 값을 변경해도 다른 하나에 영행을 주지 않는다.
따라서 복사 대상 객체의 내부에 있는 객체들까지 모두 복사하면서 새로운 객체를 생성하므로
복사된 객체와 원본 객체는 완전한 독립적인 객체라고 생각하면 된다.
예]
import java.util.Objects;
class Person {
String name;
Address address; // 참조 타입 필드
// 깊은 복사 메서드
public Person deepCopy() {
Person clonedPerson = new Person();
clonedPerson.name = this.name;
clonedPerson.address = new Address(this.address.city); // 새로운 객체 생성하여 복사
return clonedPerson;
}
}
class Address {
String city;
// 생성자
public Address(String city) {
this.city = city;
}
}
public class Main {
public static void main(String[] args) {
Address address = new Address("New York");
Person person1 = new Person();
person1.name = "John";
person1.address = address;
// 깊은 복사 수행
Person person2 = person1.deepCopy();
// person1의 address 수정
person1.address.city = "Los Angeles";
System.out.println(person2.address.city); // 출력: New York
}
}
[ChatGPT 참조]
>>
위의 예시에서 person2는 person1을 얕은 복사하여 생성되었다.
따라서 person2의 address 필드는 person1의 address와 동일한 객체를 참조하고 있음을 확인 할 수 있다.
2. 얕은 복사 (Shallow Copy) :
얕은 복사는 복사된 객체와 원본 객체가 동일한 객체를 참조하기 떄문에
둘 중 하나의 객체가 변경되면 다른 객체에도 영향을 준다.
따라서 새로운 객체를 생성하지 않고 동일한 객체를 참조하기 때문에
하나의 객체가 수정되면 다른 객체에도 영향을 미친다.
예 ]
class Person {
String name;
Address address; // 참조 타입 필드
}
class Address {
String city;
}
public class Main {
public static void main(String[] args) {
Address address = new Address();
address.city = "New York";
Person person1 = new Person();
person1.name = "John";
person1.address = address;
// 얕은 복사 수행
Person person2 = new Person();
person2.name = person1.name;
person2.address = person1.address; // 동일한 객체를 참조함
// person1과 person2는 동일한 address 객체를 참조
person1.address.city = "Los Angeles";
System.out.println(person2.address.city); // 출력: Los Angeles
}
}
[ChatGPT 참조]
>>
deepCopy() 메서드를 사용하여 person1의 깊은 복사본을 생성했다.
따라서 person2는 완전히 독립적인 객체를 가지고 있으므로, person1의 변경 사항이 person2에 영향을 미치지 않는다.
[사진 출처: Unsplash의Alexander Grey ]
'프로그래밍 언어 > Java' 카테고리의 다른 글
배열(Array) (0) | 2024.06.25 |
---|---|
패키지(Package), 임포트(import) (0) | 2024.06.25 |
메소드(Method) (0) | 2024.06.25 |
연산자(Operator) 종류와 연산자의 우선순위 (0) | 2024.06.25 |
오버플로우 (Overflow), 언더플로우(Underflow) / 형변환(Typecasting) (0) | 2024.06.25 |