얕은 복사 vs 깊은 복사: 두 판 사이의 차이

기술노트
(컴퓨터 과학 용어 정리 - 얕은 복사 vs 깊은 복사 추가)
 
편집 요약 없음
1번째 줄: 1번째 줄:
== [Cpp] 얕은 복사 vs 깊은 복사 ==
\== \[Cpp] 얕은 복사 vs 깊은 복사 ==


<br>
''얕은 복사(shallow copy)''와 ''깊은 복사(deep copy)''의 차이점과 사용 시 주의할 점에 대해 알아보자.


> shallow copy와 deep copy가 어떻게 다른지 알아보자
\=== 얕은 복사(shallow copy) ===


<br>
얕은 복사는 객체의 멤버 변수 값을 다른 객체로 복사하는 방법이다. 포인터의 경우 실제 데이터가 아니라 주소만 복사되므로, 두 객체가 같은 데이터를 공유하게 된다. 이로 인해 데이터가 변경되거나 삭제될 경우 원본과 복사본 모두에 영향을 미칠 수 있다.


==== 얕은 복사(shallow copy) ====
\=== 깊은 복사(deep copy) ===


객체의 모든 멤버 변수의 값을 다른 객체로 복사
깊은 복사는 객체의 멤버 변수뿐만 아니라 포인터 변수가 가리키는 데이터까지 완전히 별도로 복사하여 독립적인 데이터를 가진다. 따라서 복사된 객체와 원본 객체는 서로 영향을 받지 않는다.


<br>
\=== 예시 코드 ===


==== 깊은 복사(deep copy) ====
<syntaxhighlight lang="cpp">
#include <cstring>
#include <cstdlib>


모든 멤버 변수의 값뿐만 아니라, 포인터 변수가 가리키는 모든 객체에 대해서도 복사
<br>
<br>
<syntaxhighlight>cpp
struct Test {
struct Test {
    char *ptr;
char \*ptr;
};
};


void shallow_copy(Test &src, Test &dest) {
// 얕은 복사
    dest.ptr = src.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);
}
}
</syntaxhighlight>
<br>
`shallow_copy`를 사용하면, 객체 생성과 삭제에 관련된 많은 프로그래밍 오류가 프로그램 실행 시간에 발생할 수 있다.
<syntaxhighlight>
즉, 얕은 복사는 프로그래머가 스스로 무엇을 하는 지
잘 이해하고 있는 상황에서 주의하여 사용해야 한다
</syntaxhighlight>
대부분, 얕은 복사는 실제 데이터를 복제하지 않고서, 복잡한 자료구조에 관한 정보를 전달할 때 사용한다. 얕은 복사로 만들어진 객체를 삭제할 때는 조심해야 한다.
<br>


실제로 얕은 복사는 실무에서 거의 사용되지 않는다. 대부분 깊은 복사를 사용해야 하는데, 복사되는 자료구조의 크기가 작으면 더욱 깊은 복사가 필요하다.
// 깊은 복사
void deep\_copy(Test \&src, Test \&dest) {
dest.ptr = (char\*)malloc(strlen(src.ptr) + 1);
strcpy(dest.ptr, src.ptr);
} </syntaxhighlight>


<br>
\=== 주의할 점 ===


<br>
* 얕은 복사는 메모리 관리 문제로 인해 의도하지 않은 오류를 발생시킬 수 있으므로 주의가 필요하다.
* 얕은 복사는 주로 데이터를 실제 복제하지 않고 자료구조의 참조 정보를 전달할 때 사용된다. 복사된 객체를 삭제할 때는 원본 데이터에 영향이 없도록 특별히 신경 써야 한다.
* 실무에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 깊은 복사를 사용하는 것이 바람직하다.


===== [참고 자료] =====
\=== 참고 자료 ===


* 코딩 인터뷰 완전분석
* \[\[코딩 인터뷰 완전분석]]

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);
}

\=== 주의할 점 ===

  • 얕은 복사는 메모리 관리 문제로 인해 의도하지 않은 오류를 발생시킬 수 있으므로 주의가 필요하다.
  • 얕은 복사는 주로 데이터를 실제 복제하지 않고 자료구조의 참조 정보를 전달할 때 사용된다. 복사된 객체를 삭제할 때는 원본 데이터에 영향이 없도록 특별히 신경 써야 한다.
  • 실무에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 깊은 복사를 사용하는 것이 바람직하다.

\=== 참고 자료 ===

  • \[\[코딩 인터뷰 완전분석]]