본문 바로가기
Java Study

Shallow copy와 Deep copy

by xogns93 2024. 9. 19.

Shallow copyDeep copy는 객체 복사 방식의 두 가지 유형으로, 객체의 필드를 어떻게 복사하는지에 따라 구분됩니다. 이 두 가지 복사 방법은 주로 객체 내부에 참조 타입 필드(다른 객체를 참조하는 필드)가 있을 때 차이를 보입니다.

1. Shallow Copy (얕은 복사)

Shallow copy는 객체의 최상위 필드만 복사하는 방식입니다. 기본 데이터 타입 필드(예: int, float)는 새롭게 복사되지만, 참조 타입 필드(객체를 참조하는 필드)는 참조값만 복사됩니다. 즉, 객체 내부에 또 다른 객체가 있으면 그 하위 객체는 복사되지 않고, 원본 객체와 복사된 객체가 동일한 하위 객체를 참조합니다.

특징:

  • 복사 성능이 우수: 복사 과정에서 메모리 사용량이 적고 빠르게 수행됩니다.
  • 참조 공유: 하위 객체가 동일한 참조를 공유하기 때문에, 복사된 객체에서 하위 객체를 수정하면 원본 객체에도 영향을 미칩니다.

예시 (Java):

public class ShallowCopyExample implements Cloneable {
    int x;
    int[] arr;

    public ShallowCopyExample(int x, int[] arr) {
        this.x = x;
        this.arr = arr;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();  // shallow copy
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        int[] arr = {1, 2, 3};
        ShallowCopyExample original = new ShallowCopyExample(10, arr);
        ShallowCopyExample copied = (ShallowCopyExample) original.clone();

        copied.arr[0] = 100; // 복사본 수정
        System.out.println("원본 배열 값: " + original.arr[0]); // 100 (원본도 수정됨)
    }
}

장점:

  • 복사 속도가 빠르고 메모리 사용이 효율적입니다.

단점:

  • 참조하는 객체가 변경되면 원본 객체도 영향을 받아 예기치 않은 버그가 발생할 수 있습니다.

2. Deep Copy (깊은 복사)

Deep copy는 객체의 모든 필드를 완전히 새로운 복사본으로 만드는 방식입니다. 기본 데이터 타입 필드는 물론이고, 참조 타입 필드도 새로운 객체로 복사됩니다. 즉, 원본 객체와 복사된 객체가 서로 독립적인 상태를 유지합니다.

특징:

  • 참조 독립성: 복사된 객체는 원본 객체와 완전히 독립적이므로, 복사본에서 객체를 변경해도 원본 객체는 영향을 받지 않습니다.
  • 성능 비용: 깊은 복사는 객체 구조가 복잡할수록 메모리와 시간이 더 많이 소요됩니다.

예시 (Java):

public class DeepCopyExample implements Cloneable {
    int x;
    int[] arr;

    public DeepCopyExample(int x, int[] arr) {
        this.x = x;
        this.arr = arr;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // deep copy
        DeepCopyExample copy = (DeepCopyExample) super.clone();
        copy.arr = this.arr.clone();  // 배열도 별도로 복사
        return copy;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        int[] arr = {1, 2, 3};
        DeepCopyExample original = new DeepCopyExample(10, arr);
        DeepCopyExample copied = (DeepCopyExample) original.clone();

        copied.arr[0] = 100; // 복사본 수정
        System.out.println("원본 배열 값: " + original.arr[0]); // 1 (원본은 수정되지 않음)
    }
}

장점:

  • 복사된 객체가 원본 객체와 독립적이므로, 예기치 않은 상호작용이 발생하지 않습니다.

단점:

  • 복사 성능이 상대적으로 느리고, 메모리 사용량이 증가할 수 있습니다.

Shallow Copy와 Deep Copy 비교

특징 Shallow Copy Deep Copy
복사 방식 최상위 필드만 복사, 하위 객체는 참조 공유 최상위 필드와 하위 객체 모두 새로운 복사본
메모리 사용 적음 많음
성능 빠름 느림
독립성 복사본과 원본 객체가 참조를 공유함 복사본과 원본 객체가 완전히 독립적
적용 예시 간단한 객체 구조 복잡한 객체 구조, 독립성이 필요한 경우

결론

  • Shallow copy는 객체의 참조를 공유하여 메모리와 성능을 절약할 수 있지만, 참조하는 객체가 수정되면 원본 객체에도 영향을 줄 수 있습니다.
  • Deep copy는 객체를 완전히 복사하여 독립성을 유지할 수 있지만, 성능 비용이 높습니다.

따라서 두 복사 방식 중 어느 것을 사용할지는 객체 구조의 복잡성과 독립성 요구에 따라 선택해야 합니다.