[Java] Shallow Copy & Deep Copy
2023. 3. 15. 22:37ㆍ공부/기본지식
Shallow Copy
얕은 복사는 참조 변수가 가리키는 객체의 주소만 복사하고, 객체 자체는 새로 생성하지 않습니다. 이에 따라 원본 객체와 복사본 객체가 같은 객체를 참조하게 되며, 원본 객체나 복사본 객체 중 하나에서 객체 내용을 수정하면 나머지 객체도 함께 수정됩니다.
Ex) Shallow Copy
public class Person {
private String name;
private int age;
}
Person person1 = new Person();
person1.setName("Alice");
person1.setAge(20);
Person person2 = person1; // 얕은 복사
person2.setName("Bob");
System.out.println(person1.getName()); // 출력: Bob
위 코드에서 person2의 변수는 person1의 변수와 같은 객체를 참조하고 있다. 따라서 person2의 객체의 'name' 프로퍼티를 변경하면, person1 객체의 'name' 프로퍼티도 함께 변경된다. 왜냐하면 앞서 말한것과 같이 얕은 복사는 인스턴스가 생성될 때 인스턴스화 되면서 메모리에 할당된 주소의 값을 참조한다. 또한 얕은 복사는 복사 객체가 원본 객체에 종속적이다.
- 얕은 복사는 주소에 의한 참조, Call-by-reference와 유사한 개념
Deep Copy
복사하려는 원본 객체에 대해서 새로운 단일 객체, 또는 복합 객체를 만들고 원본 객체를 대상으로 인스턴스화 할 수 있는 클래스 내부의 클래스 변수(static)과 메서드(static) 뿐만 아니라 인스턴스 값 모두를 복사하여, 원본 객체로부터 독립적인 객체를 생성한다. (Call-by-values)
Ex) Deep Copy
Person person1 = new Person();
person1.setName("Alice");
person1.setAge(20);
Person person2 = new Person();
person2.setName(person1.getName());
person2.setAge(person1.getAge());
person2.setName("Bob");
System.out.println(person1.getName()); // 출력: Alice
//실제로 person2가 deep copy되었는지 확인하려면?
//person1과 person2의 메모리 주소를 확인하면 된다. 얕은 복사라면 같은 주소를 사용할 것이다.
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
'공부 > 기본지식' 카테고리의 다른 글
Singleton Pattern (0) | 2023.03.16 |
---|---|
[Java] Garbage Collection (0) | 2023.03.15 |
[Java] Primitive type & Reference type (0) | 2023.03.15 |
[Java] Overriding & Overloading (0) | 2023.03.15 |
Singleton Design Pattern 싱글톤 패턴 (0) | 2023.01.19 |