배열의 복사
배열은 한번 생성하면 그 길이를 바꿀 수 없기 때문에 더 많은 저장 공간이 필요하면
보다 큰 배열을 새로 만들고 이 전 배열을 복사해야한다.
1. 배열 arr의 길이인 arr.length 의 값이 5이므로 길이가 10인 int배열 tmp가 생성되고,
배열 tmp의 각 요소는 int의 기본값인 0으로 초기화된다.
int[] tmp = new int[arr.length*2];
-> int[] tmp = new int[5*2];
-> int[] tmp = new int[10];
2.for문을 이용해서 배열 arr의 모든 요소에 저장된 값들을 하나씩 배열 tmp에 복사한다.
for(int i=0; i<arr.length; i++)
tmp[i] = arr[i];
3. 참조변수 arr에 참조변수 tmp의 값을 저장한다.
arr의 값은 0*100에서 0*200으로 바뀌고, arr은 배열 tmp를 가리킨다.
arr = tmp;
결국 참조변수 arr과 tmp는 같은 배열. 전에 arr이 가리키던 배열은 사용 불가. 이렇게 쓸모없게 된 배열은 JVM의 가비지컬렉터에 의해 자동적으로 메모리에서 제거된다.
예3) //배열의 복사
public class ArrayEx3 {
public static void main(String[] args) {
int [] arr = new int[5];
//배열 arr에 1~5를 저장한다.
for(int i=0; i<arr.length; i++)
arr[i]=i+1;
System.out.println("[변경전]");
System.out.println("arr.length:"+arr.length);
for(int i=0; i<arr.length; i++)
System.out.println("arr["+i+"]:"+arr[i]);
//배열 복사
int [] tmp = new int[arr.length*2];
//배열에 저장된 값들을 배열 tmp에 복사한다.
for(int i=0; i<arr.length; i++)
tmp[i]=arr[i];
arr = tmp; //tmp에 저장된 값을 arr에 저장한다.
System.out.println("[변경 후]");
System.out.println("arr.length :"+arr.length);
for(int i=0; i<arr.length; i++)
System.out.println("arr["+i+"]:"+arr[i]);
}
}
System.arraycopy() 를 이용한 배열의 복사
for문은 배열 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.
arraycopy()를 호출할 때는 어느 배열의 몇 번째 요소에서 어느 배열로 몇 번째 요소로 몇 개의 값을 복사할 것인지 지정해줘야한다.
배열 num의 내용을 배열 newNum으로, 배열 num의 첫번째 요소(num[0])부터 시작해서 num.length 개의 데이터를 newNum의 첫 번째 요소(newNum[0])에 복사한다.
이 때 복사하려는 배열의 위치가 적절하지 못하여 복사하려는 내용보다 여유 공간이 적으면 에러(ArrayIndexOutOfBoundsException)가 발생.
예4) //System.arraycopy()
public class ArrayEx4 {
public static void main(String[] args) {
char[] abc = { 'A', 'B', 'C', 'D' };
char[] num = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
System.out.println(abc);
System.out.println(num);
// 배열 abc와 num을 붙여서 하나의 배열(result)로 만든다.
char[] result = new char[abc.length + num.length];
System.arraycopy(abc, 0, result, 0, abc.length);
System.arraycopy(num, 0, result, abc.length, num.length);
System.out.println(result);
// 배열 abc을 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
System.arraycopy(abc, 0, num, 0, abc.length);
System.out.println(num);
// number의 인덱스 6 위치에 3개를 복사
System.arraycopy(abc, 0, num, 6, 3);
System.out.println(num);
}
}
'JAVA > 배열(array)' 카테고리의 다른 글
[JAVA] String 배열 (0) | 2021.06.15 |
---|---|
[JAVA] 배열의 활용 예제/총합과 평균/ 최대값과 최소값/섞기/난수/정렬/빈도수 구하기 (0) | 2021.06.15 |
[JAVA] Arrays.toString (0) | 2021.06.15 |
[JAVA] 배열의 초기화 (0) | 2021.06.15 |
[JAVA] 배열의 길이와 인덱스 (0) | 2021.06.14 |