Java에서 List를  Array로 변경하는 과정에서 배운 것을 기록합니다.

https://www.baeldung.com/java-collection-toarray-methods 를 참고해서 작성했습니다.

 

List 인터페이스의 toArray()

Java에서는 List 인터페이스의 경우아래와 같은 toArray() 메서드를 지원합니다.

Object[] toArray();
<T> T[] toArray(T[] a);

 

toArray() method 사용법

toArray()의 경우 List의 사이즈를 기반으로 자동으로 배열 사이즈를 만들어줍니다.

결과는 Object[]로 반환되며, 단순하게 타입 캐스팅을 할 수 없습니다. 

만약 다음과 같이 코드를 작성하면 java.lang.ClassCastException가 발생합니다.

        List<String> stringList =new ArrayList<>();
        stringList.add("test");

        String[] stringArray = (String[]) stringList.toArray();

만약 처음부터 String[]로 받고 싶다면 아래와 같은 method를 사용하면 됩니다.

 

<T> T[] toArray(T[] a) method 사용법

해당 method는 Array의 사이즈를 지정해주어야 합니다.

방법은 다음과 같습니다.

   List<String> stringList =new ArrayList<>();
   stringList.add("test");

   String[] stringArray = stringList.toArray(new String[stringList.size()]);

이렇게 작성하면 List의 사이즈만큼 배열크기가 잡히고 String [] 배열로 리턴 받을 수 있습니다.

하지만 이 방법도 단점이 존재합니다.

예를 들자면 조건이 추가되는 경우입니다.

    public String[] toArray(List<String> list) {
        return list.toArray(new String[list.size()]);
    }

만약 위와 같이 list를 그냥 array로 반환한다고 하면 문제가 없어보이지만, 

다음과 같이 stream()을 접목했을때 불편한 상황이 발생할 수 있습니다.

    public String[] toArray(List<String> list) {
        return list.stream()
                .filter(s -> s.equals("A"))
                .toArray(new String[???]);
    }

list의 사이즈는 알고있지만, 중간에 조건이 들어가기 때문에 toArray()로 전환되는 리스트의 정확한 사이즈를 알 수 없습니다. 다행인 점은 이 모든 걸 해결하고 성능까지 가장 좋은 방법이 있습니다.

 

<T> T[] toArray(T[] a) method 효율적인 사용법

가장 좋은 해결방법은 사이즈를 항상 0으로 초기화하는 방법입니다.

    public String[] toArray(List<String> list) {
        return list.toArray(new String[0]);
    }

toArray(T[] a)는 미리 할당된 배열의 크기가 리스트의 사이즈보다 작으면 필요한 사이즈만큼 늘린 새 배열을 생성합니다.

그래서 자동으로 리스트 사이즈에 맞는 배열을 생성해 줍니다.

 

배열 사이즈를 지정해 주는 게 더 느린 이유??

ArrayList의 toArray()를 보면 외부에서 할당하여도 내부에서는 Arrays.copyOf or System.arraycopy와 같은 method들이 동작합니다. 이때 미리 할당받은 배열 사이즈만큼 값을 초기화하는 것이 새로 만드는 것보다 더 느리다는 이야기로 보입니다.

 

'Java' 카테고리의 다른 글

[Java] @Inherited 어노테이션  (0) 2023.12.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함