[language-agnostic] 깊은 사본과 얕은 사본의 차이점은 무엇입니까?

깊은 사본과 얕은 사본의 차이점은 무엇입니까?



답변

얕은 사본은 가능한 한 적게 복제합니다. 컬렉션의 얕은 복사본은 요소가 아니라 컬렉션 구조의 복사본입니다. 얕은 사본을 사용하면 이제 두 컬렉션이 개별 요소를 공유합니다.

딥 카피는 모든 것을 복제합니다. 컬렉션의 딥 카피는 원본 컬렉션의 모든 요소가 복제 된 두 컬렉션입니다.


답변

폭 대 깊이; 객체를 루트 노드로 사용하는 참조 트리의 관점에서 생각하십시오.

얕은:

복사하기 전에
얕은 복사
얕은 완료

변수 A와 B는 서로 다른 메모리 영역을 나타내며, B가 A에 할당되면 두 변수는 동일한 메모리 영역을 나타냅니다. 나중에 내용 중 하나를 수정하면 내용을 공유 할 때 다른 내용에 즉시 반영됩니다.

깊은:

복사하기 전에
딥 카피
딥 완료

변수 A 및 B는 B가 A에 할당 될 때 A가 가리키는 메모리 영역의 값이 B가 가리키는 메모리 영역에 복사되는 메모리 영역의 값을 나타냅니다. 나중에 내용의 수정은 A 또는 B에 고유하게 유지됩니다. 내용은 공유되지 않습니다.


답변

요컨대, 그것은 무엇을 가리키는 지에 달려 있습니다. 얕은 사본에서 객체 B는 메모리에서 객체 A의 위치를 ​​가리 킵니다. 딥 카피에서는 객체 A의 메모리 위치에있는 모든 것이 객체 B의 메모리 위치에 복사됩니다.

이 위키 기사에는 훌륭한 다이어그램이 있습니다.

http://en.wikipedia.org/wiki/Object_copy


답변

다음 이미지를 고려하십시오

여기에 이미지 설명을 입력하십시오

예를 들어 Object.MemberwiseClone는 생성 얕은의 복사 링크를

ICloneable 인터페이스를 사용 하면 여기에 설명 된대로 카피를 얻을 수 있습니다


답변

특히 iOS 개발자의 경우 :

경우 BA는 얕은 복사A그것처럼 원시 데이터를 다음 B = [A assign];과 같이의 개체에 대한 B = [A retain];

B와 A는 동일한 메모리 위치를 가리 킵니다.

경우 BA는 딥 카피 의가 A, 다음은 같다B = [A copy];

B와 A는 다른 메모리 위치를 가리킴

B 메모리 주소는 A와 동일

B는 A와 같은 내용을 가지고 있습니다


답변

얕은 복사 : 한 개체에서 다른 개체로 멤버 값을 복사합니다.

Deep Copy : 한 개체의 멤버 값을 다른 개체로 복사합니다.
                     모든 포인터 객체가 복제되고 딥 복사됩니다.

예:

class String
{
     int   size;
     char* data;
};

String  s1("Ace");   // s1.size = 3 s1.data=0x0000F000

String  s2 = shallowCopy(s1);
 // s2.size =3 s2.data = 0X0000F000
String  s3 = deepCopy(s1);
 // s3.size =3 s3.data = 0x0000F00F
 //                      (With Ace copied to this location.)


답변

나는 여기서 짧고 이해하기 쉬운 대답을 보지 못했기 때문에 시도해 볼 것입니다.

얕은 복사본을 사용하면 소스가 가리키는 개체도 대상이 가리키는 것이므로 참조 된 개체는 복사되지 않습니다.

깊은 사본을 사용하면 소스가 가리키는 모든 객체가 복사되고 대상이 사본을 가리 킵니다 (따라서 참조 된 각 객체 중 2 개가 있음). 이것은 객체 트리 아래로 반복됩니다.