더북(TheBook)

연습 삼아 Arrays 클래스의 copyOf 메서드를 구현해 보자. 가득 찬 배열의 길이를 copyOf 메서드로 늘렸던 방법을 되짚어 보자.

Person[ ] friends = new Person[100];

...

// 배열이 가득 찼다.

friends = Arrays.copyOf(friends, 2 * friends.length);


이런 범용 메서드를 어떻게 작성할 수 있을까? 먼저 다음과 같이 시도해 보자.

public static Object[ ] badCopyOf(Object[ ] array, int newLength) { // 유용하지 않다.

    Object[ ] newArray = new Object[newLength];

    for (int i = 0; i < Math.min(array.length, newLength); i++)

        newArray[i] = array[i];

    return newArray;

}


하지만 결과로 나오는 배열을 실제로 사용하기에는 문제가 하나 있다. 이 메서드가 반환하는 배열의 타입은 Object[ ]다. Object[ ] 배열은 Person[ ] 배열로 캐스트할 수 없다. 앞에서 설명한 것처럼 자바의 배열은 요소의 타입(즉, 해당 배열을 생성한 new 표현식에서 사용한 타입)을 기억한다는 것이 문제다. Person[ ] 배열을 임시로 Object[ ] 배열로 캐스트한 후 역으로 캐스트할 수는 있다. 하지만 원래 Object[ ]인 배열은 Person[ ] 배열로 캐스트할 수 없다.

원본 배열과 같은 타입으로 배열을 새로 만들려면 Array 클래스의 newInstance 메서드를 사용해야 한다. 이때 컴포넌트 타입과 원하는 길이를 인수로 전달한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.