반응형

Arrays의 asList

java8 API 문서에 보면 아래와 같이 나와 있습니다.

  1. 고정된 배열을 반환한다.
  2. 읽기 전용 배열을 반환한다

그래서 어떻게 사용하는 걸까?

아래와 같이 두 가지 방법으로 사용이 가능 합니다.

어떤 특징이 있을까?

  • add, remove가 불가능하다(읽기 전용). AstractList 라는 추상 클래스의 add, remove를 상속받아 사용합니다.
    아래 소스를 보면 불가능한 이유를 알 수 있습니다. UnsupportedOperationException 를 예외로 던지기 때문 입니다.
  • 변경은 가능하다.
    AbstractList 에서 set 메서드는 add, remove와 동일한 예외를 발생 시키지만, AbstractList 를 상속받아 set 메서드를 오버라이드 하기 때문에 변경이 가능합니다.
    그렇기 때문에 불변이라고 볼 수 없습니다.

  • 기준이 되는 배열의 주소를 공유한다
    주소를 공유하기 때문에 ArrayList의 값을 set하여 변경하면, 배열의 값도 변경 됩니다.
    주소를 공유하는 이유는 asList 메서드에서 new ArrayList<>(a) 를 사용하여 그대로 값을 넘기기 때문입니다.
    각각의 주소를 가지고 싶다면 List<Integer> integers = new ArrayList<>(Arrays.asList(arrInteger)); 와 같이 생성 해주면 됩니다.

  • 편리하다.

    1. 배열을 ArrayList처럼 기능을 어느 정도 사용할 수 있는 편리함
    2. Collection 클래스 중 예를 들면 add()를 남발할 필요가 없습니다.

정리

특징

  • ArrayList로 배열을 쉽게 생성할 수 있다.
  • Collection 클래스의 데이터 생성 시 코드 양을 줄일 수 있다. 케바지만 가독성도 개수가 적다면 더 좋아 보인다.
  • ArrayList의 add, remove를 사용하는 것이 아닌 AbstractList의 add, remove를 상속 받기 때문에 add, remove 불가
  • 읽기 전용이다. 하지만 set을 제공하기 때문에 불변이 아니다.
  • 기존 배열과 주소를 공유한다.
반응형
복사했습니다!