자바 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);
}
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);
}