얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy)
얕은 복사 (Shallow Copy)
얕은 복사는 객체의 모든 필드 값을 그대로 복사하는 것입니다.
하지만, 주소를 참조하는 필드가 존재한다면, 복사된 객체와 원본 객체는 같은 메모리 주소를 참조하게 됩니다.
즉, 얕은 복사는 참조 대상을 새롭게 복사하지 않으므로, 원본과 복사본이 동일한 대상을 참조하게 됩니다.
결과적으로, 하나의 객체에서 포인터가 가리키는 값을 변경하면 다른 객체에도 영향을 미치게 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Shallow
{
public:
int* data;
Shallow(int d)
{
data = new int; // 동적 메모리 할당
*data = d;
}
~Shallow()
{
delete data;
}
// 복사 생성자 (얕은 복사)
Shallow(const Shallow& source) : data(source.data) {}
};
int main()
{
Shallow obj1(2023);
Shallow obj2 = obj1; // 얕은 복사 발생
// obj1의 data 변경
*(obj1.data) = 2024;
cout << "Original data after change: " << *obj1.data << endl; // 2024
cout << "Copied data after change: " << *obj2.data << endl; // 2024
}
깊은 복사 (Deep Copy)
깊은 복사는 객체의 모든 필드를 복사하되, 참조하고 있는 객체들까지도 모두 새롭게 복사하는 것입니다.
따라서, 복사된 객체는 원본 객체와 독립적으로 존재하며, 하나의 객체에서 참조 대상의 상태를 변경해도 다른 객체에는 영향을 미치지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Deep
{
public:
int* data;
Deep(int d)
{
data = new int; // 동적 메모리 할당
*data = d;
}
~Deep()
{
delete data;
}
// 복사 생성자 (깊은 복사)
Deep(const Deep& source)
{
data = new int; // 새로운 메모리 할당
*data = *source.data;
}
};
int main()
{
Deep obj3(2023);
Deep obj4 = obj3; // 깊은 복사 발생
// obj3의 data 변경
*(obj3.data) = 2024;
cout << "Original data after change: " << *obj3.data << endl; // 2024
cout << "Copied data after change: " << *obj4.data << endl; // 2023
}
이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.