자바에서 배열을 복사할 때 사용할 수 있는 두 가지 메서드가 있다. 바로 System.arraycopy()
와 Arrays.copyOf()
이다. 사용법은 아래와 같다.
System.arraycopy()
System.arraycopy(원본배열, 원본 배열의 복사 시작 지점, 복사할 배열, 복사할 배열의 복사 시작 지점, 복사할 요소의 개수)
Arrays.copyOf()
Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)
먼저 1부터 10까지의 수를 담은 배열 arr과 크기 15의 배열 copied를 만들어준다.
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int[] copied = new int[15];
System.arraycopy()
메서드부터 사용해봤다. arr를 copied의 1번째 자리로 10개 숫자 모두 복사해왔다. 보이다 싶이 남은 공간은 0으로 채워져있다.
System.arraycopy(arr,0,copied,1,10)
System.out.println(Arrays.toString(copied));
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0]
Arrays.copyOf
메서드를 사용해봤다. arr로부터 15만큼을 복사해오고, 7만큼 복사해와봤다. 위치 지정 이런 것없이 첫번째 요소부터 지정한 길이만큼 가져온 것이 보인다.
int[] copied = Arrays.copyOf(arr, 15);
System.out.println(Arrays.toString(copied));
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]
int[] copied = Arrays.copyOf(arr, 7);
System.out.println(Arrays.toString(copied));
// [1, 2, 3, 4, 5, 6, 7]
코드로 봤을 때, 두 메서드의 차이는 복사해오는 길이/범위에 있는 것 같다. 그러나 Arrays.copyOf
의 소스 코드를 보면 System.arraycopy()
메서드를 래핑한 함수라서 사실상 같은 함수라는 사실을 알 수 있다.
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
둘의 차이가 있다면,
Arrays.copyOf
: 새로운 배열 생성 가능, 전부 복사하거나 복사 대상의 객체를 유지시킬 필요가 없을 때 사용 추천.System.arraycopy()
: 복사 길이를 명시해야 하거나, 객체를 유지하고자 할 때 사용 추천.Arrays.copyOf
가 2배가량 빠르다고 한다.참고 자료
소스코드
Arrays.copyOf가 2배가량 빠르다고 한다. -> 이건 틀린내용아닌가요
System.arrayCopy 를 래핑하는데 어떻게 2배가량 빠를수있는거죠..