얕은 복사(shallow copy)
객체가 참조하고 있는 객체의 주소만 복소
원본과 복제본이 같은 객체를 공유
이때 같은 객체란 같은 메모리의 힙(heap)주소를 말함.
원본 변경시 복제본도 영향을 받음
깊은 복사(deep copy)
객체가 참조하고 있는 객체까지 복사
원본과 복사본이 서로 다른 객체를 참조하므로 원본의 변경이 복사본에 영향을 주지 않습니다.
다음 설명에서 사용한 이미지는 해당 사이트에서 참조합니다.
https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/big3/pages/shallowvsdeep.html
Copy operations are distinguished by how they treat pointers:
-
In a shallow copy, all pointers are copied.
-
Leads to shared data on the heap.
-
-
In a deep copy, objects pointed to are copied, then the new pointer set to the address of the copied object.
-
Copied objects keep exclusive access to the things they point to.
-
This was a shallow copy:
This was a deep copy:
In this example, deep is preferred. That's not always the case. When we design an ADT we have to decide whether the things it points to are things we want to share with other objects or whether we want to own them exclusively. That's a matter of just how we want our ADTs to behave, which depends in turn on what we expect to do with them.
In this context, it should be noted that “shallow” and “deep” are actually two extremes of a range of possible copy depths - sometimes our ADTs call for a behavior that has us treat some pointers shallowly and others deeply.
더 쉽게 보충 설명을 하겠습니다.
매트릭스 스미스는 여러개의 객체를 생성했지만, 얕은 복사로 한 객체가 터질때 같이 터진다. 내부 상태가 같이 움직입니다.
전우치에서 강동원은 여러 자기복제를 했지만 깊은 복사로 한 객체가 죽어도(원래 상태로 돌아가도),
나머지 객체는 그와 상관없이 계속 싸웁니다. 즉 각자가 다른 객체값 입니다.
'Java' 카테고리의 다른 글
[자바 객체지향] is-a 관계와 has-a 관계의 비교 (0) | 2020.05.01 |
---|---|
[자바 알고리즘] 크롤링 (0) | 2020.04.30 |
[자바 8] 람다 스트림 예문 PersonService.java (출처: 자바의정석) (0) | 2020.04.30 |
[자바 알고리즘] 팩토리얼 Factorial.java (0) | 2020.04.30 |
[자바 8] 람다 Lambda 5 가지 종류 (0) | 2020.04.30 |