컬렉션 프레임워크란 여러 데이터들을 그룹으로 묶어놓은 것을 컬렉션이라고 하며, 이러한 컬렉션을 다루는 데에 있어 편리한 메서드들을 미리 정의해놓은 것을 말한다.
컬렉션 프레임워크는 특정 자료 구조에 데이터를 추가하고, 삭제하고, 수정하고, 검색하는 등의 동작을 수행하는 편리한 메서드들을 제공준다.
컬렉션 프레임워크는 주요 인터페이스로 List, Set, Map을 제공한다.
List
Set
Map
List와 Set은 서로 공통점이 많아서 Collection이라는 인터페이스로 묶인다. 이 둘의 공통점이 추출되어 추상화된 것이 바로 collection이라는 인터페이스이다.
List 인터페이스는 배열과 같이 객체를 일렬로 늘어놓은 구조를 가지고 있습니다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동으로 인덱스가 부여되고, 인덱스로 객체를 검색, 추가, 삭제할 수 있는 등의 여러 기능을 제공한다.
ArrayList<타입 매개변수> 객체명 = new ArrayList<타입 매개변수>(초기 저장 용량);
ArrayList<String> container1 = new ArrayList<String>();
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량이 인자로 전달되지 않으면 기본적으로 10으로 지정됩니다.
ArrayList<String> container2 = new ArrayList<String>(30);
// String 타입의 객체를 저장하는 ArrayList 생성
// 초기 용량을 30으로 지정하였습니다.
ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다.
그리고 특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다.
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다는 이후에 배우게 되는 LinkedList를 사용하는게 좋다
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("egg");
list.add("tree");
int size = list.size();
String skill = list.get(0);
for (int i = 0; i< list.size(); i++){
String str = list.get(i);
System.out.println(i + " : " + str);
}
for (String str : list){
System.out.println(str);
}
list.remove(0);
System.out.println(list);
}
}
LinkedList 컬렉션은 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용된다.
특이점은 LinkedList에는 불연속적으로 존재하고 데이터는 서로 연결되어 있다.
그림을 통해 보듯 각 요소들은 자신과 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성되어 있다.
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Java");
list.add("egg");
list.add("tree");
int size = list.size();
System.out.println(size);
String skill = list.get(0);
System.out.println(skill);
for (int i = 0; i<list.size(); i++){
String str = list.get(i);
System.out.println(i + " : " + str);
}
for (String str : list){
System.out.println(str);
}
list.remove(0);
System.out.println(list);
}
}
ArrayList의 특성
ArrayList에 데이터를 추가하는 상황이다.
추가 또는 삭제를 하려면 그림처럼 다른 데이터를 복사해서 이동해야 한다.
순차적으로 저장할 때는 데이터 이동이 필요 없어서 작업속도가 빠르지만
중간에 위치한 객체를 추가 및 삭제할 때에는 데이터 이동이 많이 일어나서 속도가 저하된다.
ArrayList의 강점
- 데이터 검색(읽기) 측면
- 데이터를 순차적으로 추가하거나 삭제하는 경우
- 데이터를 읽어들이는 경우
ArrayList의 단점
- 중간에 데이터를 추가하거나, 중간에 위치하는 데이터를 삭제하는 경우
LinkedList의 특성
위 그림의 Dog와 Cat 사이에 Dolphin 데이터를 추가한다면 다음과 같은 동작이 이루어진다.
1. Dolphin 객체 생성
2. Dog의 Next에 Dolphin 주소값이 저장되고 Dolphin의 Prev에 Dog 주소값이 저장 된다
3. Dolphin의 Next에 Cat의 주소값이 저장되고 Cat의 Prev에 Dolphin의 주소값이 저장된다.
LinkedList의 강점
- 중간에 데이터를 추가하거나 삭제하는 경우 빠른 속도를 보여준다.
LinkedList의 단점
- 검색에 있어서는 느리다.
⭐️결론적으로, 데이터의 잦은 변경이 예상된다면 LinkedList를, 데이터의 개수가 변하지 않는다면 ArrayList를 사용하는 것이 좋다.