Copying Arrays in Java 6-2

자바 6에서는 더 이상 이런 역할의 유틸리티 메소드가 필요가 없다. 썬은 배열의 복사를 위한 직접 지원을 소개한다. 썬은 새로운 Arrays 클래스의 오버로드된 메소드인 copyOf 를 정의한다.

1
targetArray = Arrays.copyOf(sourceArray, length);

여기서는 copyOf 메소드의 행동을 시연해보기 위해 JUnit test를 몇 개 사용하였다. 여기에 기본 기능을 보여주는 첫번째 테스트가 있다.

1
2
3
4
5
6
@Test
public void genericArrayCopyOf() {
Number[] source = { new Double(5.0), new Double(10.0) };
Number[] target = Arrays.copyOf(source, source.length);
assertEquals(source, target);
}

JUnit 4의 새로운 특징중의 하나는 assertEquals를 사용한 두개의 배열의 비교 능력이다. 그 작업을 할 때, JUnit는 첫째로 각 배열의 크기를 비교한다. 만약 두 배열이 같다면 JUnit은 equals을 사용하여 각각의 요소들을 비교한다. 두 배열이 다르면, JUnit은 failure 메시지를 나타내어 부등호 값을 보여준다.

자바는 두개의 다른 변수로 기본형 타입을 지원을 위해 copyOf 를 오버로드한다. 또 다른 테스트는 원본의 범위를 지원할 수 있는 방법을 보여준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void copyOfWithRange() {
String[] source = { "0", "1", "2", "3", "4" };
String[] target = Arrays.copyOfRange(source, 2, 4);
assertEquals(new String[] { "2", "3" }, target);
}
@Test
public void primitives() {
int[] source = { 0, 1, 2, 3, 4 };
int[] target = Arrays.copyOfRange(source, 4, 5);
assertEqualsPrim(new int[] { 4 }, target);
}

JUnit 4는 기본형 타입을 가지고 있는 두 배열을 비교할 수 없기에 assertEqualsPrim 메소드를 작성했다. It contains only a version that compares two Object arrays. assertEquals 를 이용해 두 기본형 타입의 배열을 비교하는 것은 자바가 메모리 비교를 하는 것을 의미한다. 별거 아니게, assertEqualsPrim 를 작성하는 것은 아주 쉽다.

1
2
3
4
5
6
7
8
9
10
11
12
13
static void assertEqualsPrim(int[] expected, int[] actual) {
if (expected.length != actual.length)
fail(String.format("expected length = %s, actual length = %s",
expected.length, actual.length));
for (int i = 0; i < expected.length; i++) {
if (expected[i] != actual[i])
fail(String.format(
"mismatch at index %d: expected [%s] but was [%s]", i,
expected[i], actual[i]));
}
}

What if I want the new array to be of a new, subclass type? The following test fails:

1
2
3
4
5
6
@Test
public void genericArrayCopyOfWithNewType() {
Number[] source = { new Double(5.0), new Double(10.0) };
Double[] target = (Double[])Arrays.copyOf(source, source.length);
assertEquals(source, target); // fail!
}

But Java 6 allows me to declare a new type for the target array on a copy:

1
2
3
4
5
6
@Test
public void genericArrayCopyOfWithNewType() {
Number[] source = { new Double(5.0), new Double(10.0) };
Double[] target = Arrays.copyOf(source, source.length, Double[].class);
assertEquals(source, target);
}
Share Comments