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

최혜성·2024년 1월 26일
0

분명 됐었는데?

기존에 배열을 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개의 댓글