기본적으로 프로그래밍언어에서 복사는 비슷하게 작동합니다. 두가지의 방법으롤 나타낼 수 있는데 '얕은복사', '깊은복사' 이렇게 두가지로 나타낼 수 있습니다.
얕은복사 :
인스턴스의 주소로 복사하는 것입니다. 그렇기에 기존의 배열에 변동이 생기면 복사한 배열에도 변동이 생기게됩니다.
깊은복사 :
인스턴스 주소를 복사하는게 아닌 새로운 인스턴스를 만들고 직접 값을 복사하는 방법입니다.
Java에서는 복사를 하기위해서는 반복문을 사용하거나 System.arraycopy()를 사용해서 복사를 진행합니다. 두번째 방법에 대한 사용법은 다음과 같습니다.
System.arraycopy(src,srcPos,dest,destPos,length)
src:복사할 배열 이름
srcPos:복사할 배열의 첫번째 위치
dest:복사해서 붙여 넣을 대상 배열 이름
destPos:복사해서 대상 배열에 붙여넣기를 시작할 첫번째 위치
length: src에서 dest로 자료를 복사할 요소 개수
그러면 예시를 보면서 이해해보겠습니다.
package array;
public class ArrayCopy {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array1 = {10,20,30,40,50};
int[] array2 = {1,2,3,4,5};
System.arraycopy(array1, 0, array2, 1, 4);
for(int i =0;i<array2.length;i++) {
System.out.println(array2[i]);
}
}
}
이렇게되면 1,10,20,30,40 으로 넣어지는 것을 확인 할 수 있습니다. 하지만 0번째가 아닌 1번째부터 넣었기 때문에 1은 그대로 남아있는 것을 확인 할 수 있습니다.
두번째 예시입니다.
package array;
public class ObjectCopy3 {
public static void main(String[] args) {
Book[] bookArray1=new Book[3];
Book[] bookArray2=new Book[3];
bookArray1[0]=new Book("태백산맥","조정래");
bookArray1[1]=new Book("데미안","헤르만 헤세");
bookArray1[2]=new Book("어떻게 살 것인가","유시민");
// 디폴트 생성자로 bookArray2의 배열 인스턴스 생성
bookArray2[0]=new Book();
bookArray2[1]=new Book();
bookArray2[2]=new Book();
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("박완서");
System.out.println("===bookArray1===");
for(int i=0;i<bookArray1.length;i++) {
bookArray1[i].showBookInfo();
}
System.out.println("===bookArray2===");
for(int i=0;i<bookArray2.length;i++) {
bookArray2[i].showBookInfo();
}
}
}
for문은 배열의 처음부터 끝까지 모든 요소를 참조 할 때 사용하면 편리한 반복문입니다. 향상된 for문은 배열 요소값을 순서대로 하나씩 가져와 변수에 대입합니다.
package array;
public class EnhancedForLoop {
public static void main(String[] args) {
String[] strArray= {"Java","Android","C","JavaScript","Python"};
for(String lang:strArray) {
System.out.println(lang);
}
}
}
lang은 strArray요소들을 하나씩 복사하는 모습을 볼 수 있습니다.