Goal
- ArrayList에 대해서 알아본다
- Array vs ArrayList
- 자바 버전 별 차이점에 대해서 알아본다
ArrayList 란?
Java 프로그래밍 언어에서 제공하는 컬렉션 클래스 중 하나로, 동적 크기 배열(dynamic size array)을 구현한 클래스다.
내부적으로 배열을 사용하여 요소를 저장하며, 요소의 추가, 삭제, 검색 등의 작업을 수행할 수 있다.
ArrayList는 크기를 지정하지 않고 요소를 추가할 수 있으며, 내부적으로 필요에 따라 크기가 동적으로 조정된다.
Arr ay vs ArrayList
구분 | Array | ArrayList |
크기 | 고정. 생성 이후 크기 변경 불가 | 가변 |
메모리 할당 | 생성시 할당 | 성장함에 따라 메모리 할당 (생성 비용 저렴) |
데이터 저장 | 같은 타입의 데이터 | 제네릭을 이용해 다양한 타입의 데이터 |
요소 추가/삭제 | 전체 배열을 복사하고 크기를 늘리거나 줄여야 함 | 자동으로 크기 조정 |
메모리 사용 | ArrayList보다 적은 메모리 사용 | 배열보다 많은 메모리 사용 |
반복 성능 | ArrayList보다 빠름 | 반복 성능은 느림 |
Integer[] array = new Integer[100];
System.out.println("배열 크기:" + array.length);
// 배열 크기: 100
List<Integer> list = new ArrayList<>(100);
System.out.println("배열 크기 :" + list.size());
// 배열 크기: 0
list.add(10);
System.out.println("배열 크기 :" + list.size());
// 배열 크기: 1
자바 버전 별 ArrayLIist 차이점
ArrayList in java 7
- ArrayList에 포함 된 요소의 유형이 Object로 지정되어 있어, ArrayList에 추가하는 요소의 유형을 명시적으로 지정해야함
- Object는 모든 클래스의 조상이기 때문에 어떤 종류의 클래스로도 포인팅할 수 있지만, Object 타입으로 반환하기 때문에 String으로 반환하기 위해서는 캐스팅을 해줘야함
- Collection객체로 sort()
List list = new ArrayList();
list.add("banana");
String name = (String) list.get(0);
Collections.sort(list);
문제 : 만약 list에 수만개의 String이 들어있고 모든 데이터를 꺼내야 한다면, 수만번의 type casting이 필요하므로, 시스템 성능의 큰 저하를 가져오게 됨.
ArrayList in java 8
- Generic 도입으로 ArrayList에 추가하는 요소의 유형을 명시적으로 지정해주지 않아도 됨 -> 캐스팅 필요 X
- Java8의 추가된 기능을 ArrayList에 사용이 가능
- forEach() : ArrayList의 모든 요소에 대해 주어진 동작을 수행
- removeIf() : 조건을 만족하는 요소를 ArrayList에서 제거
- replaceAll() : ArrayList의 모든 요소에 대해 주어진 함수를 적용하여 새로운 값을 할당
- sort() : ArrayList를 정렬
- spliterator() : ArrayList를 분할하는 Spliterator를 반환
- stream() : ArrayList를 스트림으로 변환
List<String> list = new ArrayList<>();
list.add("banana");
list.add("apple");
list.add("watermelon");
String name = list.get(0);
list.sort(Comparator.naturalOrder());
System.out.println("오름차순 : " + list);
list.sort(Comparator.reverseOrder());
System.out.println("내림차순 : " + list);
문제 : 불변 리스트를 만들기 위한 번거러움이 존재
- Collections 클래스의 unmodifiableList() 정적 메서드를 사용
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits = Collections.unmodifiableList(fruits);
fruits.add("Lemon"); // UnsupportedOperationException
- Arrays 클래스의 asList() 사용
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
fruits.add("lemon"); // java.lang.UnsupportedOperationException
- Stream API 사용
List<String> fruits = Stream
.of("Apple", "Banana", "Cherry")
.collect(collectingAndThen(toList(), Collections::unmodifiableList));
- Guava 라이브러리 사용
import com.google.common.collect.ImmutableList;
List<String> fruits = ImmutableList.of("Apple", "Banana", "Cherry");
fruits.add("Lemon"); // UnsupportedOperationException
ArrayList in java 9
- Java9에 추가된 메소드를 사용하여 불변컬렉션 생성 가능
- List 인터페이스의 of()
List<String> list = List.of("banana", "apple", "watermelon");
list.add("lemon"); // UnsupportedOperationException
참고
'JAVA > about java' 카테고리의 다른 글
[JVM] jvm / java.lang (1) | 2023.04.25 |
---|---|
[Annotation] 어노테이션 (1) | 2023.04.25 |
[String] String 클래스 (0) | 2023.04.23 |
[String] String 빈 값 및 Null 체크 (0) | 2023.04.19 |
[Interface, abstract, enum] 인터페이스, 추상클래스, enum / 예외처리 (0) | 2023.04.19 |