얕은 복사 vs 깊은 복사: 두 판 사이의 차이
기술노트
편집 요약 없음 |
편집 요약 없음 |
||
1번째 줄: | 1번째 줄: | ||
== [Cpp] 얕은 복사 vs 깊은 복사 == | |||
''얕은 복사(shallow copy)''와 ''깊은 복사(deep copy)''의 차이점과 사용 시 주의할 점에 대해 알아보자. | '''얕은 복사(shallow copy)'''와 '''깊은 복사(deep copy)'''의 차이점과 사용 시 주의할 점에 대해 알아보자. | ||
=== 얕은 복사(shallow copy) === | |||
얕은 복사는 객체의 멤버 변수 값을 다른 객체로 복사하는 방법이다. | 얕은 복사는 객체의 멤버 변수 값을 다른 객체로 복사하는 방법이다. 특히 포인터 변수를 복사할 때, 실제 데이터가 아니라 주소만 복사하기 때문에, 두 객체는 동일한 데이터를 공유하게 된다. 이로 인해 데이터가 변경되거나 삭제될 경우 원본 객체와 복사본 객체 모두 영향을 받을 수 있다. | ||
=== 깊은 복사(deep copy) === | |||
깊은 복사는 객체의 멤버 | 깊은 복사는 객체의 멤버 변수뿐 아니라, 포인터 변수가 가리키는 데이터까지 모두 별도의 공간에 완전히 복사한다. 이렇게 복사된 객체는 원본 객체와 독립적이므로, 한 객체의 데이터 변경이 다른 객체에 영향을 미치지 않는다. | ||
=== 예시 코드 === | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
18번째 줄: | 18번째 줄: | ||
struct Test { | struct Test { | ||
char | char *ptr; | ||
}; | }; | ||
// 얕은 복사 | // 얕은 복사 | ||
void | void shallow_copy(Test &src, Test &dest) { | ||
dest.ptr = src.ptr; | dest.ptr = src.ptr; | ||
} | } | ||
// 깊은 복사 | // 깊은 복사 | ||
void | void deep_copy(Test &src, Test &dest) { | ||
dest.ptr = (char | dest.ptr = (char*)malloc(strlen(src.ptr) + 1); | ||
strcpy(dest.ptr, src.ptr); | strcpy(dest.ptr, src.ptr); | ||
} </syntaxhighlight> | } | ||
</syntaxhighlight> | |||
=== 주의할 점 === | |||
* 얕은 | * 얕은 복사를 사용할 때는 메모리 관리 문제로 인해 의도하지 않은 오류가 발생할 수 있으므로 매우 신중하게 사용해야 한다. | ||
* 얕은 복사는 | * 얕은 복사는 실제 데이터를 복제하지 않고 자료구조의 참조 정보만 전달할 때 주로 사용된다. 복사된 객체를 삭제할 때는 원본 데이터가 삭제되지 않도록 반드시 주의해야 한다. | ||
* | * 실제 개발 현장에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 더욱 깊은 복사를 사용하는 것이 권장된다. | ||
=== 참고 자료 === | |||
* | * [[코딩 인터뷰 완전분석]] |
2025년 5월 5일 (월) 07:50 기준 최신판
[Cpp] 얕은 복사 vs 깊은 복사
얕은 복사(shallow copy)와 깊은 복사(deep copy)의 차이점과 사용 시 주의할 점에 대해 알아보자.
얕은 복사(shallow copy)
얕은 복사는 객체의 멤버 변수 값을 다른 객체로 복사하는 방법이다. 특히 포인터 변수를 복사할 때, 실제 데이터가 아니라 주소만 복사하기 때문에, 두 객체는 동일한 데이터를 공유하게 된다. 이로 인해 데이터가 변경되거나 삭제될 경우 원본 객체와 복사본 객체 모두 영향을 받을 수 있다.
깊은 복사(deep copy)
깊은 복사는 객체의 멤버 변수뿐 아니라, 포인터 변수가 가리키는 데이터까지 모두 별도의 공간에 완전히 복사한다. 이렇게 복사된 객체는 원본 객체와 독립적이므로, 한 객체의 데이터 변경이 다른 객체에 영향을 미치지 않는다.
예시 코드
#include <cstring>
#include <cstdlib>
struct Test {
char *ptr;
};
// 얕은 복사
void shallow_copy(Test &src, Test &dest) {
dest.ptr = src.ptr;
}
// 깊은 복사
void deep_copy(Test &src, Test &dest) {
dest.ptr = (char*)malloc(strlen(src.ptr) + 1);
strcpy(dest.ptr, src.ptr);
}
주의할 점
- 얕은 복사를 사용할 때는 메모리 관리 문제로 인해 의도하지 않은 오류가 발생할 수 있으므로 매우 신중하게 사용해야 한다.
- 얕은 복사는 실제 데이터를 복제하지 않고 자료구조의 참조 정보만 전달할 때 주로 사용된다. 복사된 객체를 삭제할 때는 원본 데이터가 삭제되지 않도록 반드시 주의해야 한다.
- 실제 개발 현장에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 더욱 깊은 복사를 사용하는 것이 권장된다.