{{위키데이터 속성 추적}}
[[객체 지향 프로그래밍]]에서 '''객체 복사'''(object copying)는 객체 지향 프로그램에서 말하는 데이터 단위인 기존의 객체의 사본을 [[객체 생성|생성]]하는 것이다. 그 결과로 나오는 객체를 "객체 사본"(object copy) 또는 간단히 "사본"(copy)이라고 부른다. 복사는 기초적이지만 예민성이 있어서 상당한 부하를 일으킬 수 있다. 객체 복사에는 여러 방법이 있으며 그 중 가장 흔한 것이 [[생성자|복사 생성자]]나 복제를 통한 것이다. 사본은 수정이나 이동이 가능하며 현재 값을 보존할 수 있다. 이 중 어느 것도 불필요하다면 복사가 발생되지 않는 방식으로 원본 데이터의 참조만으로 충분하며 더 효율적이다.

객체는 일반적으로 [[컴포지트 자료형|컴포지트 데이터]]를 저장한다. 단순한 경우 복사는 새로운, 초기화되지 않은 객체를 할당하여 원본 객체의 모든 필드 [[속성 (컴퓨터 과학)|속성]]을 복사함으로써 이루어지지만 복잡한 경우 이는 원하는 동작대로 결과가 나오지 않게 된다.

== 복사 방식 ==
객체들 대부분의 설계적 목표는 하나의 획일적인 블록으로 만들어진 것과 유사한 것을 제공하는 것이다. 객체는 여러 부분으로 구성되므로 복사는 사소한 일이 아니다. 이 문제를 처리하기 위해 여러 전략이 존재한다.

x<sub>i</sub> 필드를 포함하는 객체 A가 있다고 가정하자. (구체적으로 말해, A가 문자열이고 x<sub>i</sub>가 문자 배열임). 여기서 A의 사본을 만들기 위한 각기 다른 전략으로 얕은 복사(shallow copy)와 깊은 복사(deep copy)가 있다. 수많은 언어는 하나의 "복사" 조작을 정의하여, 또는 개개의 "얕은 복사"와 "깊은 복사" 조작을 정의하여 이루어지는 총체적인 복사를 허용한다.{{sfn|Grogono|Sakkinen|2000}}

얕은 복사, 깊은 복사라는 용어는 [[스몰토크]]-80으로 거슬러 올라간다.{{sfn|Goldberg|Robson|1983|pages=97–99|ps=. "There are two ways to make copies of an object. The distinction is whether or not the values of the object's variables are copied. If the values are not copied, then they are shared (<code>shallowCopy</code>); if the values are copied, then they are not shared (<code>deepCopy</code>)."}}

=== 얕은 복사 ===
객체를 복사하는 한 방식으로 '''얕은 복사'''가 있다. 이 경우 새 객체 B가 [[객체 생성|생성]]되며 A의 필드 값들은 B로 복사된다.<ref>{{웹 인용|title=C++ Shallow vs Deep Copy Explanation|url=http://www.fredosaurus.com/notes-cpp/oop-condestructors/shallowdeepcopy.html|확인날짜=2019-12-19|archive-date=2014-02-10|archive-url=https://web.archive.org/web/20140210114305/http://www.fredosaurus.com/notes-cpp/oop-condestructors/shallowdeepcopy.html|url-status=}}</ref><ref>{{웹 인용|title=.NET Shallow vs Deep Copy Explanation|url=http://www.codeproject.com/Articles/28952/Shallow-Copy-vs-Deep-Copy-in-NET|확인날짜=2019-12-19|보존url=https://web.archive.org/web/20191219225726/https://www.codeproject.com/Articles/28952/Shallow-Copy-vs-Deep-Copy-in-NET|보존날짜=2019-12-19|url-status=dead}}</ref><ref>{{웹 인용|title=Java Shallow vs Deep Copy Explanation|url=http://javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/|확인날짜=2019-12-19|보존url=https://web.archive.org/web/20191219225716/https://javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/|보존날짜=2019-12-19|url-status=dead}}</ref><ref>{{웹 인용|title=Generic Shallow vs Deep Copy Explanation|url=https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/big3/pages/shallowvsdeep.html|확인날짜=2019-12-19|보존url=https://web.archive.org/web/20160304115828/https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/big3/pages/shallowvsdeep.html|보존날짜=2016-03-04|url-status=dead}}</ref> 이를 필드-바이-필드 카피(field-by-field copy)라고 부르며,<ref>Core Java: Fundamentals, Volume 1, [https://books.google.com/books?id=QTZvAQAAQBAJ&pg=PA295&dq=%22field+copy%22 p. 295]</ref><ref>''[[Effective Java]]'', Second Edition, [https://books.google.com/books?id=ka2VUBqHiWkC&pg=PA54&dq=%22field+copy%22 p. 54]</ref><ref>"[https://stackoverflow.com/questions/2890340/what-is-this-field-by-field-copy-done-by-object-clone What is this field-by-field copy done by Object.clone()?] {{웨이백|url=https://stackoverflow.com/questions/2890340/what-is-this-field-by-field-copy-done-by-object-clone |date=20170510081647 }}", ''Stack Overflow''</ref> 필드-포-필드 카피(field-for-field copy), 필드 복사(field copy)라고도 한다.<ref>"Josh Bloch on Design: A Conversation with Effective Java Author, Josh Bloch", by Bill Venners, ''JavaWorld'', January 4, 2002, [http://www.artima.com/intv/bloch13.html p. 13]</ref> 필드 값이 객체 참조인 경우(예: 메모리 참조) 참조를 복사하므로 A가 참조하는 것과 동일한 객체를 참조하며 필드 값이 원시 자료형인 경우 원시 자료형의 값을 복사한다. 원시 자료형이 없는 언어(모든 것이 객체)의 경우 사본 B의 모든 필드는 원본 A 필드와 동일한 객체의 참조가 된다. 이렇게 참조된 객체는 공유되므로 이 객체들 중 하나가 수정되면(A 또는 B로부터) 다른 쪽에서도 변경 사항이 보이게 된다. 얕은 복사는 단순하고 일반적으로 비용이 적으므로 단순히 비트를 정확히 복사함으로써 구현할 수 있는 것이 보통이다.

=== 깊은 복사 ===
{{multiple image
| align = right
| image1 = deep copy in progress.svg
| width1 = 200
| alt1 = 진행 중인 깊은 복사.
| caption1 = 진행 중인 깊은 복사.
<!--
| image2 = deep copy done.svg
| width2 = 200
| alt2 = 완료된 깊은 복사.
| caption2 = 완료된 깊은 복사.
| footer = 
-->
}}
얕은 복사의 대안으로 깊은 복사가 있다. 이는 필드가 역참조됨을 의미한다. 즉, 복사되는 객체에 대한 참조 대신, 참조가 되는 모든 객체를 위한 새 사본의 객체가 만들어진다. 사본 B에 의해 참조되는 객체들이 A에 의해 참조되는 것과 구별되어 독립적이라는 점에서 깊은 복사의 결과는 얕은 복사의 결과와 구별이 된다. 깊은 복사는 추가 객체의 생성이 필요하기 때문에 비용이 더 많으며, 참조가 잠재적으로 복잡한 그래프를 형성할 수 있기 때문에 상당히 더 복잡하다.

== 같이 보기 ==
* [[생성자]]
* [[연산자 오버로딩]]
* [[참조 횟수 계산 방식]]

== 각주 ==
{{각주}}

== 참고 문헌 ==
* {{서적 인용|isbn        = 978-0-201-11371-6
 |title       = Smalltalk-80: The Language and its Implementation
 |last1       = Goldberg
 |first1      = Adele
 |authorlink1 = Adele Goldberg (computer scientist)
 |last2       = Robson
 |first2      = David
 |year        = 1983
 |publisher   = Xerox Palo Alto Research Center
 |location    = Palo Alto, California
 |url         = https://archive.org/details/smalltalk80langu00gold
 |ref         = harv
 |url-access  = registration
}}
* {{콘퍼런스 인용 |title= Copying and Comparing: Problems and Solutions |last1= Grogono |first1= Peter |last2= Sakkinen |first2= Markku |conference= ECOOP 2000 — Object-Oriented Programming |date= 12 May 2000 |editor= Elisa Bertino |book-title= Lecture Notes in Computer Science |volume= 1850 |pages= 226–250 |publisher= Springer Berlin Heidelberg |doi= 10.1007/3-540-45102-1_11 |url= http://users.encs.concordia.ca/~grogono/Writings/CopyCompare.pdf |ref= Harv |accessdate= 2015-06-23 |archive-date= 2016-03-04 |archive-url= https://web.archive.org/web/20160304201813/http://users.encs.concordia.ca/~grogono/Writings/CopyCompare.pdf }}

[[분류:객체 지향 프로그래밍]]