List 인터페이스를 확인해보면 아래 두가지 타입의 메서드를 확인할 수 있습니다.
이 두 메소드는 컬렉션을 배열로 변환해주는 메소드 입니다.
그럼 이 둘의 차이에 대해 알아보도록 하겠습니다.
파라미터로 전달되는 것이 없는 toArray()의 경우 반환값이 Object 배열을 반환해줍니다.
만약 Object가 아닌 다른 클래스 배열로 변환하고자 한다면 toArray(T[] a) 메소드를 사용해야 합니다.
해당 메소드의 경우 전달된 배열 a의 크기에따라 다른 결과값을 반환합니다.
배열로 변환하는 컬렉션의 크기가 10이라고 가정할때 a의 길이가 작은 경우와 크거나 같은 경우 두가지 경우로 나뉩니다.
toArray 메서드는 전달받은 배열 a의 크기를 확인한 뒤 비교과정을 통해 더 길면 복사, 짧으면 새로운 배열을 생성한다는 것을 알 수 있었습니다.
그 말은, 항상 가장 작은 배열 길이인 0으로 생성한다면 가장 안정적인 형태의 변환이 가능하다는 말이 될수 있습니다.
첫번째로, 만들어질 타입을 명시해 줌으로써 항상 지정된 타입을 보장
합니다.
두번째로, Java 11 이후 JDK에서는 new T[0]의 크기가 0인 경우, 내부적으로 리스트 크기에 맞는 배열을 즉시 생성하도록 최적화 되어있기때문에 성능적으로도 우수
합니다.
List<Integer> list = new ArrayList<>();
Object[] answer1 = list.toArray(); // 별도 캐스팅 필요
Integer[] answer2 = list.toArray(new Integer[0]);