프로그래밍 언어/Java

깊은 복사(Deep Copy) , 얕은 복사 (Shallow Copy)

devlara 2024. 6. 25. 16:22
 배열의  깊은 복사(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에 영향을 미치지 않는다.

 

 

[사진 출처: UnsplashAlexander Grey ]