JAVA/배열(array)

[JAVA] 배열의 복사 /System.arraycopy()

prize1209 2021. 6. 15. 03:57

배열의 복사 

배열은 한번 생성하면 그 길이를 바꿀 수 없기 때문에 더 많은 저장 공간이 필요하면

보다 큰 배열을 새로 만들고 이 전 배열을 복사해야한다. 

 

 

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);
	}
}