1 minute read

얕은 복사와 깊은 복사

수업 초반 때 얕은 복사와 깊은 복사를 배운 적이 있는데 그 때 제대로 이해를 못 했던 것 같다. 최근 수업 때 다시 이것을 언급하셨는데 이 둘을 머릿속으로 구분을 할 수 없어서 다시 정리해본다.

결론을 간단하게 말하면

  • 얕은 복사 : 객체의 참조값(주소값)을 복사

  • 깊은 복사 : 객체의 실제 값(value)를 복사

얕은 복사(shallow copy)

  • 객체를 복사할 때, 해당 객체만 복사하여 새 객체를 생성
  • 복사된 객체의 인스턴스 변수는 원본 객체의 인스턴스 변수와 같은 메모리 주소를 참조
  • 따라서 해당 메모리 주소의 값이 변경되면 원본 객체 및 복사 객체의 인스턴스 변수 값은 함께 변경

이게 맞는지 모르겠으나 간단하게 예시를 들어보면

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> arr1 {1,2,3,4};
    vector<int>& arr2 = arr1;
    arr2[1] = 100; // {1,100,3,4}
    
    for (auto num : arr1) {
        cout << num << ' ';
    }
    return 0;
}

arr1을 출력하면 1 100 3 4가 출력된다. arr2가 arr1을 참조하고, arr2의 값을 바꾸면 arr1의 값도 바뀐다.

깊은 복사(deep copy)

  • 객체를 복사할 때, 해당 객체와 인스턴스 변수까지 복사하는 방식
  • 전부를 복사하여 새 주소를 담기 때문에 참조를 공유하지 않는다.

이것 또한 간단한 예시를 든다면,

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> arr1 {1,2,3,4};
    vector<int> arr2 = arr1;
    arr2[1] = 100; // {1,100,3,4}
    
    for (auto num : arr1) {
        cout << num << ' ';
    }
    return 0;
}

이 코드는 arr1을 출력하면 1 2 3 4가 출력된다. value만을 복사해서 왔기 때문이다.

그런데 사실 C++에서 깊은 복사와 얕은 복사를 이해하려면 클래스와 생성자, 소멸자, 복사 생성자의 개념을 알아야한다. 이 개념들은 상당히 복잡해서.. 아직 공부가 부족하기에 참고를 위한 랑크를 남긴다.

– 공부하고 추가 예정..

Tags:

Categories:

Updated: