모두의 코드 커뮤니티

C++ 강좌 4-2. 관련 댓글 내용중, 질문

물론 point 들의 배열을 생성해도 됩니다. 그런데 만약에 point 들을 새로 여러개 추가하려 하는 경우를 생각해보세요. point 들의 배열을 사용하였을 경우, 새로운 point 배열을 할당한 뒤에, 기존의 point 객체들을 모두 복사해야 합니다. 물론 여기서 point 의 크기는 그리 크지 않겠지만, 만약에 다른 무거운 객체의 경우 복사에 시간이 오래 걸리겠지요.반면에 point* 를 사용한다면, point 가 아니라, point*, 즉 주소값만 복사하면 됩니다. 주소값은 8바이트이므로, 매우 빠르게 이를 수행할 수 있습니다.

라는 답글을 보았습니다. 보면서 궁금한 점이 있습니다.

int array[10]={1,2,3,4,5,6};
int* array_point=NULL;
array_point = array;

array_point도 원래 객체인 array[100]을 가르키게 되는데,

array[0]=0;
cout<<array_point[0]; // 출력은 0, 기댓값 1

그렇게 되면 진정한 의미의 복사가 아니지 않나요? 만약 정말 객체를 복사한다면 어떻게 복사하는지 궁금합니다.

1 Like

복사를 한다는 의미는 deep copy 를 말한 것입니다.

위 경우

int* array_point = new int[10];
for (int i = 0; i < 10; i ++) {
  array_point[i] = array[i];
} // 그 이후에 array 는 삭제

이런 느낌이겠죠?

int ary[10]={0,1,2,3};
int *ary2=ary;
int* ary=new int[10];
int* array_point = new int[10];
for (int i = 0; i < 10; i ++) {
  array_point[i] = array[i];
}
delete ary;
ary=array_point;

1번과 2번 모두 deep copy라고 말하는 것 같은데 제가 이해한 바가 맞나요?

1 Like

1 의 경우 shallow copy 라고 생각하면 됩니다. 1 의 경우 단순히 int 10 개 짜리 공간을 가리키는 포인터를 하나 더 만든 거지만 2 의 경우 10 개 짜리 공간 자체를 새로 만들었거든요.