깊은 사본과 얕은 사본의 차이점은 무엇입니까?
답변
얕은 사본은 가능한 한 적게 복제합니다. 컬렉션의 얕은 복사본은 요소가 아니라 컬렉션 구조의 복사본입니다. 얕은 사본을 사용하면 이제 두 컬렉션이 개별 요소를 공유합니다.
딥 카피는 모든 것을 복제합니다. 컬렉션의 딥 카피는 원본 컬렉션의 모든 요소가 복제 된 두 컬렉션입니다.
답변
폭 대 깊이; 객체를 루트 노드로 사용하는 참조 트리의 관점에서 생각하십시오.
얕은:
변수 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는 생성 얕은의 복사 링크를
답변
특히 iOS 개발자의 경우 :
경우 B
A는 얕은 복사 의 A
그것처럼 원시 데이터를 다음 B = [A assign];
과 같이의 개체에 대한 B = [A retain]
;
B와 A는 동일한 메모리 위치를 가리 킵니다.
경우 B
A는 딥 카피 의가 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 개가 있음). 이것은 객체 트리 아래로 반복됩니다.