1. 얕은 복사란?

  • 개념: 원본 객체와 복사된 객체가 같은 메모리 주소를 공유.
  • 특징:
    • 포인터 멤버 변수를 복사하면, 두 객체가 같은 메모리 공간을 참조.
    • 하나의 객체에서 데이터를 변경하거나 삭제하면, 다른 객체에도 영향을 미침.
  • 장점:
    • 빠르고 간단하며 메모리 사용량이 적음.
  • 단점:
    • 메모리 관리 문제 발생 가능 (중복 해제 등).

2. 깊은 복사란?

  • 개념: 원본 객체와 복사된 객체가 독립적인 메모리 공간을 가짐.
  • 특징:
    • 포인터 멤버 변수를 복사할 때, 새로운 메모리 공간을 할당하여 데이터를 복사.
    • 원본과 복사본이 독립적으로 동작.
  • 장점:
    • 안전한 메모리 관리와 독립성 보장.
  • 단점:
    • 메모리 사용량 증가 및 구현이 복잡.

3. 얕은 복사와 깊은 복사의 차이

특징얕은 복사깊은 복사
메모리 공유 여부원본과 복사본이 같은 메모리 주소를 공유원본과 복사본이 독립적인 메모리 공간을 가짐
메모리 관리관리가 어렵고, 충돌 및 누수 가능성 있음안전하며 충돌 가능성 없음
복사 속도빠름상대적으로 느림
사용 예시단순 값 복사에 적합동적 메모리를 포함한 객체에서 필수적

4. 얕은 복사 예제

코드:

#include <string>
using namespace std;

class Pet
{
public:
    Pet() {}
    ~Pet() {}
public:
    int _age;
    int _name;
};

class Person
{
public:
    Person() : _age(0), _name("")
    {
        _pet = new Pet;
        cout << "Person 얕은 복사" << endl;
    }

    ~Person()
    {
        cout << "Person 소멸자" << endl;
        delete _pet;
    }

public:
    int _age;
    string _name;
    Pet* _pet;
};

int main()
{
    Person p1 = Person(); 
    Person p2 = p1;  // 얕은 복사 발생
}

분석:

  1. p1 객체 생성:

    • Person 생성자가 호출되어 _pet 멤버가 동적으로 할당.
    • 출력: Person 얕은 복사.
  2. p2 객체 복사:

    • 디폴트 복사 생성자로 인해 얕은 복사가 발생.
    • p1._petp2._pet같은 메모리 주소를 가리킴.
  3. 문제점:

    • p1이나 p2 중 하나가 소멸되면, _pet의 메모리가 해제됨.
    • 다른 객체는 이미 해제된 메모리를 참조하여 에러 발생.

5. 깊은 복사 예제

코드:

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

class Pet
{
public:
    Pet() {}
    ~Pet() {}
public:
    int _age;
    int _name;
};

class Person
{
public:
    Person() : _age(0), _name("")
    {
        _pet = new Pet;
        cout << "Person 얕은 복사" << endl;
    }

    // 복사 생성자
    Person(const Person& other)
    {
        _age = other._age;
        _name = other._name;
        _pet = new Pet;  // 새로운 메모리 공간 할당
        cout << "Person 깊은 복사" << endl;
    }

    ~Person()
    {
        cout << "Person 소멸자" << endl;
        delete _pet;  // 메모리 해제
    }

public:
    int _age;
    string _name;
    Pet* _pet;
};

int main()
{
    Person p1 = Person(); 
    Person p2 = Person(p1);  // 깊은 복사 발생
}

분석:

  1. p1 객체 생성:

    • Person 생성자가 호출되어 _pet 멤버가 동적으로 할당.
    • 출력: Person 얕은 복사.
  2. p2 객체 복사:

    • 복사 생성자가 호출되어 깊은 복사가 수행됨.
    • _pet 멤버가 새로운 메모리 공간을 가지며, 원본과 복사본은 독립적임.
    • 출력: Person 깊은 복사.
  3. 안전성:

    • p1p2_pet은 독립적인 메모리 공간을 가지므로, 한 객체가 소멸되어도 다른 객체에 영향을 주지 않음.

profile
李家네_공부방

0개의 댓글