배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다. 배열 간의 항목 값들을 복사하려면 ①for문을 사용하거나 ②System.arraycopy() 메소드를 사용하면 된다.
1. for문으로 배열을 복사하는 코드
public class ArrayCopyByForExample{
public static void main(String[] args){
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i=0;i<oldIntArray.length;i++){
newIntArray[i] = oldIntArray[i];
}
for(int i=0;i<newIntArray.length;i++){
System.out.print(newIntArray[i] + ", ");
}
}
}
<실행결과>
1, 2, 3, 0, 0
위 코드는 복사되지 않은 항복은 int[] 배열의 기본 초기값 0이 그대로 유지된다.
2. System.arraycopy() 메소드로 배열 복사하는 코드
이번에는 System.arraycopy() 메소드를 이용해서 배열을 복사해보자. System.arraycopy()를 호출하는 방법은 다음과 같다.
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src 매개값은 원본 배열이고, srcPos는 원본 배열에서 복사할 항목의 시작 인덱스이다. dest 매개값은 새 배열이고, destPos는 새 배열에서 붙여넣을 시작 인덱스이다. 마지막으로 length는 복사할 개수이다. 예를 들어 원본 배열이 arr1이고 새 배열이 arr2일 경우 arr1의 모든 항목을 arr2에 복사하려면 다음과 같이 System.arraycopy() 메소드를 호출하면 된다.
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
public class ArrayCopyExample{
public static void main(String[] args){
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i=0;i<newStrArray.length;i++){
System.out.print(newStrArray[i] + ", ");
}
}
}
<실행결과>
java, array, copy, null, null
위 코드는 다음과 같이 배열을 복사시킨다. 복사되지 않은 항목은 String[] 배열의 기본 초기값 null이 그대로 유지된다.
참조 타입 배열일 경우, 배열 복사가 되면 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일하다. 이것을 얕은 복사(shallow copy)라고 한다. 반대로 깊은 복사(deep copy)는 참조하는 객체도 별도로 생성하는 것을 말한다.
몇 일 전, 학교에서 형들끼리 얕은 복사/깊은 복사의 정확한 정의가 무엇인지에 대해 내기를 한 적이 있다.
나는 정확한 정의를 알지 못해 의견을 내지 못했었는데
두 복사의 정확한 차이는 참조 타입을 별도로 생성하냐 생성하지 않냐의 차이라는 것을 기억해야겠다.
'JAVA' 카테고리의 다른 글
[JAVA] StringBuffer, StringBuilder 클래스 (0) | 2023.07.04 |
---|