컬렉션 프레임웍(Collections Framework)
def: 데이터 그룹(群)을 저장하는 클래스들을 표준화한 것.
크게 3타입이 존재한다.
- List: 순서가 있는 데이터 집합
- Set: 순서를 유지하지 않는 데이터 집합
- Map: key와 value로 이루어진 데이터 집합
List와 Set은 공통점이 많아 추가적으로 Collection 인터페이스로 정의된다. (List와 Set이 Collection을 상속)
ArrayList
기존의 배열과 다른 점
배열의 사이즈는 초기화 시 고정되기 때문에 변경이 불가하다. 하지만 ArrayList는 동적이어서 사이즈를 선언하지 않고 원소를 유동적으로 add, remove할 수 있다.
배열은 다차원이 가능하나 ArrayList는 불가하다.
import java.util.*; class ArrayListEx1 { public static void main(String[] args) { int[] myArr = new int[3]; // 초기화 시 사이즈 고정 myArr[0] = 100; myArr[7] = 100; // Err! ArraysOutOfBoundException ArrayList<Integer> myArrayList = new ArrayList<>(); // 사이즈 미할당 myArrayList.add(1); // 괄호 안에는 넣고자 하는 value myArrayList.add(2); myArrayList.add(3); myArrayList.add(4); myArrayList.remove(0); // 0번째 인덱스 값 삭제 // traditional for문으로 ArrayList 출력 for(int i = 0 ; i < myArrayList.size() ; i++) { System.out.println(myArrayList.get(i)); } // inhanced for문으로 ArrayList 출력 for(int data : myArrayList) { System.out.println(data); } // iterator로 ArrayList 출력 iterator it = myArrayList.iterator(); while(it.hasNext()) { System.out.println(it.next()); } // 배열 출력 System.out.println(Arrays.toString(myArr)); // [100, 0, 0] } }
ArrayList의 몇가지 메서드
size()
- 어레이리스트의 사이즈를 리턴(배열의 length 개념) 참고로 String 객체는 String.length();
add(i, v);
- i번째 인덱스에 v 객체 추가한다
set(i, v);
- i번째 인덱스에 있는 것을 v 객체로 변경
arrayList1.retainAll(arrayList2);
- arrayList2와 공통적인 원소를 제외하고 제거
remove(i);
- i번째 인덱스 제거
arrayList1.contains(arrayList2.get(i));
- 해당 value를 갖고 있는지 아닌지 여부를 boolean으로 반환
arrayList.subList(a, b);
- 자바스크립트 slice랑 같음. a번째 인덱스부터 b번째 인덱스 전까지 잘라서 리턴. 사이즈는 b-a. 참고로 String 객체는 substring(a, b);
LinkedList
LinkedList는 기존의 배열이 가지고 있는 단점들 - 크기를 변경할 수 없다, 비순차적 데이터 추가 및 삭제에 시간이 많이 걸린다 - 을 보완하기 위해 만들어졌다.
배열이 연속적인 데이터를 갖고 있는 반면 링크드리스트는 불연속적인 데이터들을 연결(Link)한 형태이다.
데이터 추가와 삭제가 빠르다.
- 삭제할 때에는 삭제하고자 하는 요소 전의 요소가 기존의 요소가 아닌 다음 요소의 주소를 참조하게 하면 된다.
- 추가하고자 할 때에는 새로운 요소를 생성한 다음 삽입하고자 하는 위치 이전의 요소가 새로운 요소 주소를 참조하게 하고, 새로운 요소가 다음 요소를 참조하게 하면 된다.
더블 링크드 리스트
- 링크드리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근은 어렵다. 이를 보완한 것이
더블 링크드 리스트(Doubly Linked List)
이다. - 기존 링크드 리스트는 다음 요소만 참조하나, 이에 더하여 이전 요소를 참조하도록 한 것이다.
- 실제로 LinkedList클래스는 이름과 달리 링크드 리스트가 아닌 더블 링크드 리스트로 구현되어 있다.
- 링크드리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근은 어렵다. 이를 보완한 것이
더블 서큘러 링크드 리스트(
Doubly Circular Linked List
)- 더블 링크드 리스트보다 연결성을 더 향상시킨 것으로, 더블 링크드 리스트의 첫번째 요소와 마지막 요소를 서로 연결시킨 것이다. 즉 마지막 요소의 다음 요소는 첫번째 요소이다.
+) ArrayList는 동적인 배열 느낌. LinkedList는 내가 알고 있는 리스트 같은 느낌.