내가 알던 ArrayList가 전부가 아니예요.

공병주(Chris)·2021년 10월 22일
1

Java를 탄탄히

목록 보기
1/9
post-thumbnail

우리가 흔히 사용하는 ArrayList

대부분 사람들이 알고 있는 Collection 중의 하나인 ArraysList이다.

일반적인 배열과 거의 비슷하고 활용성이 좋기 때문에 List의 구현객체로 많이 사용된다.

Arrays.asList()

ArrayList를 선언하면서 초기화 시켜주기 위해서, 흔히 Arrays.asList()를 Collection을 매개변수로 가지는 ArrayList 생성자의 매개변수로 넣어준다.

그렇다면 Arrays.asList()는 Collection 인터페이스를 구현하는 객체를 반환하는건데, 대체 무엇을 반환할까?

ArrayList를 반환한다고? 🤷🏻‍♂️

Arrays의 asList 메소드를 살펴보았는데 ArrayList를 반환하는 것을 알 수 있다.

그래서 나는 이렇게 생각했다.

  • List numbers = new ArrayList(Arrays.asList(1, 2, 3));
    → 굳이 이렇게 해야하나?
  • List numbers = Arrays.asList(1, 2, 3);
    → 간단하고 좋잖아~!

내가 알던 ArrayList가 아니야 😭

Compile Error는 발생하지 않는다!

하지만 실행 결과는...

UnsupportedOperationException 발생...!!!!! (Remove 메소드도 마찬가지)

그 이유에 대해서 찾으려고 asList를 다시 보았는데,

asList가 반환하는 ArrayList는 Arrays의 내부에 선언된(nested) ArrayList였다.

위와 같이 우리가 흔히 아는 ArrayList와 같은 이름을 하고 있다.

똑같이 AbstractList를 상속받는다.

java.util.Arrays의 nested인 ArrayList와 java.util.ArrayList는 둘다

AbstractList를 상속받기 때문에 add와 remove를 처리할 수 있다.

✔️ 또한 java.util.ArrayList는 add와 remove가 자신만의 방식으로 Override 되어있다.
하지만 Arrays의 nested된 ArrayList는 그렇지 않다.

그래서 왜 예외가 난거야

위 사진은 Java API 문서 중 asList에 대한 Description이다.

💡 Returns a fixed-size list backed by the specified array

이유는 바로 Fixed-Size 였다. add와 remove를 하면 size의 변경이 발생하는데 asList()는 fixed-Size를 반환하기 때문에 UnsupportedOperationException가 발생했던 것이다.

profile
self-motivation

0개의 댓글