얕은 복사 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) {
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);
36번째 줄: 33번째 줄:
</syntaxhighlight>
</syntaxhighlight>


<br>
=== 주의할 점 ===
 
`shallow_copy`를 사용하면, 객체 생성과 삭제에 관련된 많은 프로그래밍 오류가 프로그램 실행 시간에 발생할 수 있다.
 
<syntaxhighlight>
즉, 얕은 복사는 프로그래머가 스스로 무엇을 하는 지
잘 이해하고 있는 상황에서 주의하여 사용해야 한다
</syntaxhighlight>
 
대부분, 얕은 복사는 실제 데이터를 복제하지 않고서, 복잡한 자료구조에 관한 정보를 전달할 때 사용한다. 얕은 복사로 만들어진 객체를 삭제할 때는 조심해야 한다.
 
<br>
 
실제로 얕은 복사는 실무에서 거의 사용되지 않는다. 대부분 깊은 복사를 사용해야 하는데, 복사되는 자료구조의 크기가 작으면 더욱 깊은 복사가 필요하다.
 
<br>


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


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


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

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

주의할 점

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

참고 자료