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