[C++] 얕은 복사와 깊은 복사
얕은 복사와 깊은 복사
수업 초반 때 얕은 복사와 깊은 복사를 배운 적이 있는데 그 때 제대로 이해를 못 했던 것 같다. 최근 수업 때 다시 이것을 언급하셨는데 이 둘을 머릿속으로 구분을 할 수 없어서 다시 정리해본다.
결론을 간단하게 말하면
얕은 복사 : 객체의 참조값(주소값)을 복사
깊은 복사 : 객체의 실제 값(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++에서 깊은 복사와 얕은 복사를 이해하려면 클래스와 생성자, 소멸자, 복사 생성자의 개념을 알아야한다. 이 개념들은 상당히 복잡해서.. 아직 공부가 부족하기에 참고를 위한 랑크를 남긴다.
– 공부하고 추가 예정..