Shallow Copy(์์ ๋ณต์ฌ)
Shallow Copy(์์ ๋ณต์ฌ)๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ๋ณต์ฌํ์ฌ, ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ฒ ํ๋ค. ์ด๋ ์๋์น ์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ด๋ํ ์ ์๋ค.
๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ง ๋ณต์ฌํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ(ํฌ์ธํฐ)๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๊ทธ๋๋ก ๋ณต์ฌํ๋ ๋ฐฉ์. ์ฆ, ์์ ๋ณต์ฌ๋ ๋ณต์ฌ๋ ๊ฐ์ฒด์ ์๋ณธ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ฉฐ, ์ด๋ก ์ธํด ํ๋์ ๊ฐ์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ๋ค๋ฅธ ๊ฐ์ฒด๋ ์ํฅ์ ๋ฐ์ ์ ์๋ค.
ex)
#include <iostream>
class MyClass {
public:
int* data;
// ์์ฑ์
MyClass(int value) {
data = new int(value);
}
// ๋ณต์ฌ ์์ฑ์(์์ ๋ณต์ฌ)
MyClass(const MyClass& other) {
data = other.data; // ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ๋ณต์ฌ
}
void display() const {
std::cout << "Value: " << *data << std::endl;
}
};
int main() {
MyClass obj1(10);
MyClass obj2 = obj1; // ์์ ๋ณต์ฌ
obj1.display(); // Value: 10
obj2.display(); // Value: 10
// obj2์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ
*obj2.data = 20;
obj1.display(); // Value: 20 (obj1๋ ์ํฅ์ ๋ฐ์)
obj2.display(); // Value: 20
return 0;
}
- ์์ ์์ ์์ obj1๊ณผ obj2๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณต์ ํ๊ณ ์๋ค. ๋ฐ๋ผ์ obj2์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด obj1๋ ๊ทธ ์ํฅ์ ๋ฐ๋๋ค. ์๋ํ์ง ์์ ๋ฐ์ดํฐ ์์ ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ธก๋ฉด์์๋ ๋ณต์กํ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
Deep Copy(๊น์ ๋ณต์ฌ)
Deep Copy(๊น์ ๋ณต์ฌ)๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ์ฌ, ์๋ณธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋๋ก ํ๋ค. ์ด๋ฅผ ํตํด ์์ ๋ณต์ฌ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ค.
์์ ๋ณต์ฌ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด๋ค. ๊น์ ๋ณต์ฌ์์๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ๋, ์ฐธ์กฐํ๊ณ ์๋ ๋ฐ์ดํฐ๋ ์๋กญ๊ฒ ๋ณต์ฌํ์ฌ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณต์ฌ๋ ๊ฐ์ฒด๋ ์๋ณธ ๊ฐ์ฒด์ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ง๋ฉฐ, ํ๋์ ๊ฐ์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ex)
#include <iostream>
class MyClass {
public:
int* data;
// ์์ฑ์
MyClass(int value) {
data = new int(value);
}
// ๋ณต์ฌ ์์ฑ์(๊น์ ๋ณต์ฌ)
MyClass(const MyClass& other) {
data = new int(*other.data); // ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๊ฐ ๋ณต์ฌ
}
// ์๋ฉธ์ (๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง)
~MyClass() {
delete data;
}
void display() const {
std::cout << "Value: " << *data << std::endl;
}
};
int main() {
MyClass obj1(10);
MyClass obj2 = obj1; // ๊น์ ๋ณต์ฌ
obj1.display(); // Value: 10
obj2.display(); // Value: 10
// obj2์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ
*obj2.data = 20;
obj1.display(); // Value: 10 (obj1์ ์ํฅ์ ๋ฐ์ง ์์)
obj2.display(); // Value: 20
return 0;
}