[JAVA]深いコピーと浅いコピー
System.arraycopy()
メソッドを使用して以前にオブジェクト配列をコピーした例を表示します.ここで、オブジェクト配列コピー後にbookArray1 [0]
の値を変更するとどうなりますか?bookArray[0].setBookName="나목";
bookArray[0].setAuthor="박완서";
for (int i=0;i<bookArray2.length;i++) {
bookArray2[i].showBookInfo();
}
/* 출력결과
나목, 박완서
데미안, 헤르만 헤세
어떻게 살 것인가, 유시민
*/
このコードを追加して出力結果を表示すると、bookArray2
の値も変化します.これは、オブジェクト配列に格納される値がインスタンス自体ではなく、インスタンスのアドレス値であるためです.したがって、オブジェクト配列がコピーされると、インスタンスのアドレス値がコピーされます.したがって、
bookArray1
およびbookArray2
は最終的に同じインスタンスを指し、bookArray1
における変更値もbookArray2
に反映される.このように、実際のインスタンスではなくアドレス値をコピーするコピーを
얕은 복사 (shallow copy)
と呼ぶ.逆に、実際のインスタンスをコピーして、2つのオブジェクト配列が異なるインスタンスを指す
깊은 복사(deep copy)
と呼ばれる.深度コピーの方法オブジェクト配列をコピーするときに異なるインスタンスを持つ場合は、インスタンスを直接作成し、要素値をコピーできます.
Book [] bookArray1 = new Book[3];
Book [] bookArray2 = new Book[3];
bookArray1[0]= new Book("태백산맥","조정래");
bookArray1[1]= new Book("데미안","헤르만 헤세");
bookArray1[2]= new Book("어떻게 살 것인가","유시민");
bookArray2[0]= new Book();
bookArray2[1]= new Book();
bookArray2[2]= new Book();
//bookArray2 배열 인스턴스 생성
for (int i=0;i<bookArray1.length;i++) {
bookArray2[i].setBookName(bookArray1[i].getBookName());
bookArray2[i].setAuthor(bookArray1[i].getAuthor());
}
for (int i=0;i<bookArray2.length;i++) {
bookArray2[i].showBookInfo();
}
/* 출력결과
태백산맥, 조정래
데미안, 헤르만 헤세
어떻게 살 것인가, 유시민
*/
bookArray1[0].setBookName("나목");
bookArray1[0].setAuthor("박완서");
for (int i=0;i<bookArray2.length;i++) {
bookArray2[i].showBookInfo();
}
/* 출력결과
태백산맥, 조정래
데미안, 헤르만 헤세
어떻게 살 것인가, 유시민
*/
bookArray 1の値を変更しても、bookArrayの値に影響がないことが確認できます.深いレプリケーションと浅いレプリケーションは、オブジェクトをレプリケーションする際に考慮される概念です。
Reference
この問題について([JAVA]深いコピーと浅いコピー), 我々は、より多くの情報をここで見つけました https://velog.io/@kekim20/JAVA-깊은복사와-얕은복사-deep-copy-and-shallow-copyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol