[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の値に影響がないことが確認できます.
深いレプリケーションと浅いレプリケーションは、オブジェクトをレプリケーションする際に考慮される概念です。