본문 바로가기
IT/c++

C++ 깊은복사와 얕은복사: 객체 복사의 이해와 활용

by 뉴코딩맨 2023. 8. 3.
C++에서 객체를 복사하는 것은 프로그래밍에서 중요하고 흔한 작업입니다. 그러나 C++에서는 깊은 복사와 얕은 복사 두 가지 다른 복사 방법이 존재합니다. C++의 깊은 복사와 얕은 복사의 개념과 차이점을 설명하고, 어떤 상황에서 어떤 방법을 사용해야 하는지에 대해 알아보겠습니다.

 

 

1. 깊은 복사와 얕은 복사란?

깊은 복사(deep copy)와 얕은 복사(shallow copy)는 객체를 복사하는 두 가지 다른 방법입니다. 깊은 복사는 원본 객체와 완전히 독립적인 새로운 객체를 생성하여 값들을 복사하는 것을 의미하며, 얕은 복사는 원본 객체와 복사된 객체가 같은 메모리를 공유하는 방법입니다.
 

2. 깊은 복사와 얕은 복사의 차이점

깊은 복사와 얕은 복사는 복사된 객체의 변경이 원본 객체에 영향을 미치는지 여부로 구분됩니다. 깊은 복사는 복사된 객체가 원본 객체와 독립적으로 동작하며, 얕은 복사는 복사된 객체와 원본 객체가 메모리를 공유하여 변경이 서로 영향을 미칩니다.
 

3. 깊은 복사의 활용 예제

 
#include <iostream>
#include <cstring>
using namespace std;

class Person {
private:
    char* name;

public:
    Person(const char* n) {
        name = new char[strlen(n) + 1];
        strcpy(name, n);
    }

    Person(const Person& other) {
        name = new char[strlen(other.name) + 1];
        strcpy(name, other.name);
    }

    ~Person() {
        delete[] name;
    }

    void display() const {
        cout << "Name: " << name << endl;
    }
};

int main() {
    Person person1("John");
    Person person2 = person1; // 깊은 복사
    person2.display();
    return 0;
}
 
 

4. 얕은 복사의 활용 예제

 

 

#include <iostream>
using namespace std;

class Point {
private:
    int x;
    int y;

public:
    Point(int a, int b) : x(a), y(b) {}

    Point(const Point& other) : x(other.x), y(other.y) {}

    void display() const {
        cout << "x: " << x << ", y: " << y << endl;
    }
};

int main() {
    Point point1(1, 2);
    Point point2 = point1; // 얕은 복사
    point2.display();
    return 0;
}

 

5. 깊은 복사와 얕은 복사를 선택하는 기준

  • 객체가 동적으로 할당된 자원을 소유하는 경우에는 깊은 복사를 선택합니다.
  • 객체가 동적으로 할당된 자원을 소유하지 않고, 단순한 값들의 집합인 경우에는 얕은 복사를 선택합니다.
  • 객체에 소유권 개념이 필요한 경우에는 깊은 복사를 선택합니다.

 

6. 깊은 복사와 얕은 복사의 장단점

  • 깊은 복사는 안전하고 독립적인 복사를 제공하지만, 메모리 사용량이 더 많습니다.
  • 얕은 복사는 메모리 사용량이 적지만, 객체의 복사가 어려울 수 있고 의도하지 않은 결과를 초래할 수 있습니다.

 

7. 정리

이 글에서는 C++에서 객체를 복사하는 두 가지 방법인 깊은 복사와 얕은 복사에 대해 알아보았습니다. 깊은 복사는 독립적이고 안전한 복사를 제공하며, 얕은 복사는 메모리 절약을 할 수 있지만 의도하지 않은 결과를 초래할 수 있습니다. 따라서 객체의 속성과 상황을 고려하여 적절한 복사 방법을 선택하는 것이 중요합니다.

 

 

댓글