성장일기

1. 배열의 복사 

배열은 한번 생성하면 길이를 변경할 수 없다. 따라서 더 많은 저장공간이 필요하면 더 큰 새로운 배열을 만들어서 기존의 배열에 있는 요소들을 일일히 복사해야 한다.

 

 for문을 이용하여 배열의 일일히 복사해야 하는데 이러한 작업들은 꽤나 비용이 많이 든다. 물론 for문을 이용해도 되지만 System클래스의 arraycopy()메소드를 이용하면 보다 간단하고 빠르게 배열을 복사할 수 있다. for문은 배열 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있는 배열의 특성때문에 이렇게 처리하는 것이 가능한 것이다.

 

따라서 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

 

 

2. arraycopy() 메소드

arraycopy()메소드는 5개의 파라미터를 인자로 받는다.

 

System.arraycopy(arr, 0, newArr, 0, arr.length);

=> arr[0]에서 newArr[0]으로 arr.length개의 요소를 복사

 

 배열 arr내용을 배열 newArr으로, 배열 arr의 첫 번째 요소(arr[0])부터 시작해서 arr.length개의 데이터를 newArr의 첫 번째 요소(newArr[0])에 복사한다.

 

이때 복사하려는 배열의 인덱스가 적절하지 못하는 경우 에러(ArrayIndexOutOfBoundsException)가 발생한다.

 

 

3. 예제코드

int[] arr = new int[]{1, 2, 3, 4, 5};

int[] newArr = new int[10];
int[] newArr2 = new int[10];

System.arraycopy(arr, 0, newArr, 0, arr.length);
System.out.println("newArr = " + Arrays.toString(newArr));

System.arraycopy(arr, 0, newArr2, 5, arr.length - 2);
System.out.println("newArr2 = " + Arrays.toString(newArr2));

 

 

실행결과는 아래와 같다.

System.arraycopy(arr, 0, newArr, 0, arr.length);

배열 arr의 0번째 인덱스부터 새로운 배열 newArr의 0번째 인덱스로 5(arr.length)개의 요소 복사

newArr = [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]

 

System.arraycopy(arr, 0, newArr2, 5, arr.length - 2);

배열 arr의 0번째 인덱스부터 새로운 배열 newArr의 5번째 인덱스로 3(arr.length-2)개의 요소 복사

newArr2 = [0, 0, 0, 0, 0, 1, 2, 3, 0, 0]

 

공유하기

facebook twitter kakaoTalk kakaostory naver band