java.util.Arrays 클래스를 활용한 배열복사

배열은 같은 타입의 변수들을 묶어서 다룰 수 있도록 해준다. 

이러한 배열은 지정한 타입의 크기와 지정되는 배열의 크기에 따라서 메모리 공간을 연속적으로 할당받게 된다.

이러한 메모리 공간은 할당받기 전까지는 공통으로 사용되어지는 자원이다. 그렇기에 컴파일하게 된 시점부터는 연속적으로 다음 공간을 할당받을 수 있을지 알 수 없고 현재 사용되고 있는 공간일 수도 있다. 그렇기에 배열의 경우 컴파일 이전에 소스코드 레벨에서만 크기를 지정해줄 수 있으면, 컴파일되고 런타임되는 시점부터는 한번 지정된 배열의 크기는 변경할 수 없다. 

 

한 가지 예로 데이터들을 받아서 순차적으로 인덱스에 값들을 채워가다가 더 이상 사용할 수 있는 공간이 없으면 어떻게 할까? 실제로 공간을 식별하기 위해 부여된 인덱스 범위를 넘어가면  java.lang.ArrayIndexOutOfBoundsException 이 발생하게 된다. 그럼 기존에 있던 데이터에 덮어쓰기 해야하는걸까? 

 

보통은 현재 배열의 크기에 2배정도 잡고 새로운 배열을 만들면 좋다고 한다. 그리고 새롭게 만들어진 배열에 기존 배열을 복사한 후 새로 만들어진 배열을 참조하면 된다. 이 부분은 참조형 변수에 대해서 생각해보면서 공부해니 시너지가 났다.

 

최종적으로 이와같이 배열을 손쉽게 복사할 수 있도록 java.util.Arrays 클래스에서는 다음과 같이  copyOf(), copyOfRange() 두 가지 메서드를 통하여 배열을 복사할 수 있는 기능을 제공한다.

 

- copyOf(복사할배열, 새롭게 만들 배열의 크기)

만들어지는 배열의 크기를 기준으로 복사할 배열의 0번 인덱스부터 복사된다. 
이때, 복사할 배열보다 크기가 클 경우 나머지부분은 기본 값으로 채워진다.
//기준 배열
int[] arr = {0,1,2,3,4};

int[] copyArr = Arrays.copyOf(arr, arr.length); // 결과 : [0, 1, 2, 3, 4]
System.out.println("Arrays.toString(copyArr) = " + Arrays.toString(copyArr));
int[] copyArr2 = Arrays.copyOf(arr,3); //  결과 : [0, 1, 2]
System.out.println("Arrays.toString(copyArr2) = " + Arrays.toString(copyArr2));
int[] copyArr3 = Arrays.copyOf(arr,10); // 결과 : [0, 1, 2, 3, 4, 0, 0, 0, 0, 0]
System.out.println("Arrays.toString(copyArr3) = " + Arrays.toString(copyArr3));

- copyOfRange(복사할배열, 복사할 배열 시작위치, 복사할 배열 끝 위치 -1)

복사할 배열을 중심으로 새로운 배열을 만든다.
즉, 복사할 배열의 copy할 인덱스 범위를 지정할 수 있으며, 기존 배열의 인덱스 범위 최대를 넘어서는 위치를 지정할 경우 차이만큼 기본값으로 채워진다.
//기준 배열
int[] arr = {0,1,2,3,4};

int[] copyArr = Arrays.copyOfRange(arr,2,10); // 결과  : [2, 3, 4, 0, 0, 0, 0, 0] 
System.out.println("Arrays.toString(copyArr) = " + Arrays.toString(copyArr));

int[] copyArr2 = Arrays.copyOfRange(arr, 2, 4);  // 결과 : [2, 3]
System.out.println("Arrays.toString(copyArr2) = " + Arrays.toString(copyArr2));

 

'P.L > Java' 카테고리의 다른 글

예외처리(Exception handling)  (0) 2023.02.01
java.lang.Character 클래스  (0) 2023.01.28
String 클래스 - repeat()  (0) 2022.12.20
스트림(Stream) 개요  (0) 2022.06.06
기본형 타입 형변환  (0) 2020.08.02