[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