Java에서 배열을 복사할 때, 사용하는 arraycopy에 대해서 알아보자. 이전에 '얕은 복사 vs 깊은 복사’에서도 잠깐 다뤘으며 System.arraycopy는 깊은 복사할 때 사용한다.

System.arraycopy

위에서 언급했듯이, 배열의 deep Copy를 할 때 사용한다고 했다. for문을 이용해서 deep Copy가 가능하기도 한데, System.arraycopy의 장점은 무엇일까?

[1] System.arraycopy vs Array hard copy

찾아보니 System.arraycopy는 native 코드를 호출해서 사용하므로 속도가 더 빠르다고 한다. 직접 실행해보지는 않았지만, stackoverflow 글을 보니 궁금해하던 사람이 실제로 수행한 결과를 보여주었다.

[2] System.arraycopy vs Arrays.copyOf

배열을 복사할 때, 종종 Arrays.copyOf를 쓰기도 하는데 이는 System.arraycopy를 래핑한 함수이다. 즉, 동일하다.

1
2
3
4
5
6
7
8
9
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

위의 copyOf는 실제 Java에서 구현된 함수를 가지고 왔다. 내부를 살펴보면 System.arraycopy를 호출하여 배열을 복사하는 것을 알 수 있다.

배열의 복사가 필요할 때는 for문 보다는 System.arraycopy나 Arrays.copyOf를 이용하는게 직관적이므로 권장된다. 전체 길이를 전부 복사하거나 복사 대상의 객체를 유지하지 않아도 된다면 copyOf를 사용하자. 복사하는 길이를 명시해야 하거나 객체를 유지해야 한다면 System.arraycopy를 사용하면 된다.

Ref