C Programming Language/C++

C++ Shallow Copy(์–•์€ ๋ณต์‚ฌ)์™€ Deep Copy(๊นŠ์€ ๋ณต์‚ฌ)

567Rabbit 2024. 8. 29. 13:24

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;
}