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

기술노트
편집 요약 없음
편집 요약 없음
 
1번째 줄: 1번째 줄:
\== \[Cpp] 얕은 복사 vs 깊은 복사 ==
== [Cpp] 얕은 복사 vs 깊은 복사 ==


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


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


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


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


깊은 복사는 객체의 멤버 변수뿐만 아니라 포인터 변수가 가리키는 데이터까지 완전히 별도로 복사하여 독립적인 데이터를 가진다. 따라서 복사된 객체와 원본 객체는 서로 영향을 받지 않는다.
깊은 복사는 객체의 멤버 변수뿐 아니라, 포인터 변수가 가리키는 데이터까지 모두 별도의 공간에 완전히 복사한다. 이렇게 복사된 객체는 원본 객체와 독립적이므로, 한 객체의 데이터 변경이 다른 객체에 영향을 미치지 않는다.


\=== 예시 코드 ===
=== 예시 코드 ===


<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
18번째 줄: 18번째 줄:


struct Test {
struct Test {
char \*ptr;
    char *ptr;
};
};


// 얕은 복사
// 얕은 복사
void shallow\_copy(Test \&src, Test \&dest) {
void shallow_copy(Test &src, Test &dest) {
dest.ptr = src.ptr;
    dest.ptr = src.ptr;
}
}


// 깊은 복사
// 깊은 복사
void deep\_copy(Test \&src, Test \&dest) {
void deep_copy(Test &src, Test &dest) {
dest.ptr = (char\*)malloc(strlen(src.ptr) + 1);
    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);
}

주의할 점

  • 얕은 복사를 사용할 때는 메모리 관리 문제로 인해 의도하지 않은 오류가 발생할 수 있으므로 매우 신중하게 사용해야 한다.
  • 얕은 복사는 실제 데이터를 복제하지 않고 자료구조의 참조 정보만 전달할 때 주로 사용된다. 복사된 객체를 삭제할 때는 원본 데이터가 삭제되지 않도록 반드시 주의해야 한다.
  • 실제 개발 현장에서는 대부분 깊은 복사를 사용하며, 복사할 데이터 크기가 작을수록 더욱 깊은 복사를 사용하는 것이 권장된다.

참고 자료