728x90
안녕하세요!
이번에는 C++에서의 깊은 복사와 얕은 복사에 대해 알아보겠습니다.
객체를 복사할 때는 이 두 가지 방법을 사용하여 메모리 관리와 객체의 독립성을 유지할 수 있습니다.
얕은 복사 (Shallow Copy)
- 얕은 복사는 단순히 객체의 멤버 변수를 복사하여 동일한 데이터를 공유하는 방식입니다.
- 이 경우에는 복사된 객체와 원본 객체가 같은 데이터를 가지므로 한 쪽에서 변경이 일어나면 다른 쪽도 영향을 받게 됩니다.
아래는 얕은 복사의 예제입니다.
#include <iostream>
class ShallowCopy
{
private:
int* data;
public:
ShallowCopy(int value)
{
data = new int(value);
}
void setValue(int value)
{
*data = value;
}
void printValue()
{
std::cout << "Value: " << *data << std::endl;
}
};
int main()
{
ShallowCopy original(5);
ShallowCopy shallowCopy = original; // 얕은 복사
original.setValue(10);
original.printValue(); // 출력: Value: 10
shallowCopy.printValue(); // 출력: Value: 10 (같은 데이터를 공유)
return 0;
}
- ShallowCopy 클래스는 동적으로 할당된 int 타입의 데이터를 가지고 있습니다.
- shallowCopy 객체를 original 객체로 얕은 복사하면, 두 객체는 같은 데이터를 공유하게 됩니다.
- 따라서 original 객체의 값을 변경하면 shallowCopy 객체도 영향을 받습니다.
깊은 복사 (Deep Copy)
- 깊은 복사는 객체의 멤버 변수를 새로운 메모리 공간에 복사하는 방식입니다.
- 이렇게 복사된 객체는 원본 객체와 완전히 독립적으로 동작하며, 한 쪽에서 변경이 일어나더라도 다른 쪽은 영향을 받지 않습니다.
아래는 깊은 복사의 예제입니다.
#include <iostream>
class DeepCopy
{
private:
int* data;
public:
DeepCopy(int value)
{
data = new int(value);
}
DeepCopy(const DeepCopy& other)
{
data = new int(*other.data);
}
~DeepCopy()
{
delete data;
}
void setValue(int value)
{
*data = value;
}
void printValue()
{
std::cout << "Value: " << *data << std::endl;
}
};
int main()
{
DeepCopy original(5);
DeepCopy deepCopy = original; // 깊은 복사
original.setValue(10);
original.printValue(); // 출력: Value: 10
deepCopy.printValue(); // 출력: Value: 5 (독립적인 메모리)
return 0;
}
- DeepCopy 클래스는 복사 생성자를 사용하여 깊은 복사를 구현합니다.
- 새로운 객체를 생성하면 내부 데이터를 새로 할당하여 복사합니다.
- 따라서 original 객체의 값을 변경해도 deepCopy 객체는 독립적인 메모리를 가지므로 영향을 받지 않습니다.
깊은 복사는 객체의 독립성을 유지하기 위해 중요한 개념입니다.
하지만 깊은 복사는 원본 객체의 크기가 크거나 복사 과정이 복잡할 경우에는 성능에 영향을 미칠 수 있습니다.
따라서 상황에 맞게 얕은 복사와 깊은 복사를 적절히 선택해야 합니다.
감사합니다!
728x90
'[C++] > 프로그래밍 기초' 카테고리의 다른 글
[C++] 프로그래밍 기초 : 클래스와 구조체의 차이 (24) | 2023.06.08 |
---|---|
[C++] 프로그래밍 기초 : 재귀함수 (7) | 2023.06.07 |
[C++] 프로그래밍 기초 : 콜백 함수와 함수 포인터 (0) | 2023.06.05 |
[C++] 프로그래밍 기초 : 코딩 컨벤션 (5) | 2023.06.05 |
[C++] 프로그래밍 기초 : 조건부 컴파일 (4) | 2023.06.05 |