Arrays.asList는 왜 배열을 받지 않을까?

최혜성·2024년 1월 26일

분명 됐었는데?

기존에 배열을 List로 변환하기 위해 Arrays.asList() 메소드를 종종 사용했었다.
물론 변경된 List는 Mutable하지는 않지만, 그래도 List로 래핑되어 사용하기 편했고,
리스트를 변경하고 싶으면 ArrayList등으로 감싸면 됐었다.

근데..

최근에 Arrays.asList를 사용해서 int[]를 Integer List로 변경하려 했었다. 근데 리턴값이 Integer가 아니라 int[]로 구성된 1개짜리 리스트가 반환되었다

그래서 왜 안되나 싶어서 찾아봤더니 Java 9 이상부터는 해당 메소드의 구현이 변경되어 있었고, 굳이 해당 방식을 사용하고 싶으면 List.of를 사용하거나 Stream으로 변경해서 리스트로 매핑하면 된다고 한다.

  • 실제 구현이 변경된 모습. 예전엔 T[]도 지원했음
 @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

왜 변경한걸까?

Java 9부터는 Array개념을 도입해서 분리시킨것 같다.

여담.

이펙티브 자바 32.를 참조하면 가변인수와 제네릭을 함께 쓰면 힙 오염이 발생하는 등 여러모로 좋지 않다고 한다.
가변 인수 자체가 배열로 컴파일 되는데, 컴파일 타임에서 충분한 타입 정보가 주어지지 않아 작동중 잘못된 타입 캐스팅으로 오류가 간혹 발생한다고 한다.
ex) T array를 기대했으나, Object Array로 반환받아 오류 발생하는등등..

그래서 @SafeVarargs 어노테이션을 안전하게 접근하는 메소드에 선언해둔다고 하는데, 위 메소드도 어노테이션이 붙어있으니 안심하고 사용해도 되겠다.

그래서 대처방법?

코틀린이면 Array자체 내에 toMutableList, toList같은 함수가 존재하고,
자바는 List.of를 사용하거나, Arrays.stream(array).toList() 와 같이 매핑하는 방법도 있다.

profile
KRW 채굴기

0개의 댓글