Shallow Copy, Deep Copy

유경우·2024년 3월 11일
0

CS

목록 보기
16/21
post-custom-banner

들어가기 전

객체를 복사하는 과정에서 "얕은 복사(Shallow Copy)"와 "깊은 복사(Deep Copy)"는 중요한 개념입니다.

이 두 복사 방법은 객체의 복사본을 생성할 때 내부의 값들이 어떻게 처리되는지에 대한 차이를 가지며, 이는 프로그래밍에서 데이터 관리와 메모리 관리의 핵심적인 부분입니다.

얕은 복사 (Shallow 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 리스트를 변경하면 다른 객체에도 영향을 미칩니다.

깊은 복사 (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 = 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

profile
개발자
post-custom-banner

0개의 댓글