Q.
- 자바의 컬렉션 프레임워크 중 List 컬렉션에 대해 정리하세요.
A.
컬렉션 프레임워크(Collection framework)란?
컬렉션 프레임워크는 다수의 데이터를 효과적으로 처리하기 위해 자료구조와 알고리즘을 구현한 클래스들을 일컫는다. Collection 인터페이스를 최상위로 상속관계를 이루는 Set과 List 인터페이스가 존재하며, 양자와는 다른 형태로 또 다른 갈래를 이루는 Map 인터페이스가 존재한다. Map 인터페이스가 Set과 List 인터페이스와 다른 갈래를 이루는 것은 Map과 Set, List 사이에 구조상의 차이가 존재하기 때문이다.
주요 인터페이스의 간략한 특징
인터페이스 | 설명 | 구현 클래스 |
List<E> | 순서가 있는 데이터 집합으로 데이터의 중복을 허용한다. | ArrayList, Vector, LinkedList, Stack, Queue |
Set<E> | 순서가 없는 데이터 집합으로 데이터의 중복을 허용하지 않는다. (수학에서의 '집합'에 대응) |
HashSet, TreeSet, LinkedHashSet |
Map<K, V> | Key와 Value가 한 쌍을 이루는 데이터 집합으로 순서는 없다. (수학에서의 '함수'에 대응. 즉, key = 정의역, value = 치역) key의 중복은 허용되지 않으나 value의 값은중복이 가능하다. |
HashMap, TreeMap, Hashtable, Properties |
List 컬렉션 클래스
List 인터페이스를 구현한 모든 List 컬렉션 클래스는 요소의 저장 순서가 유지되며 같은 요소의 중복 저장을 허용한다는 두 가지 특징을 지닌다.
- 요소의 저장 순서가 유지된다.
- 같은 요소의 중복 저장이 허용된다.
대표적인 List 컬렉션 클래스
ArrayList<E> 클래스
참고 : <E>는 제네릭을 의미한다.
ArrayList<E>는 자바에서 가장 많이 사용되는 컬렉션 클래스 중 하나로 JDK(Java Development Kit) 1.2부터 제공되었다. 내부적으로 배열을 이용하여 요소를 저장하는 ArrayList는 배열을 사용한다는 특징 때문에 인덱스를 이용해 배열 요소에 빠르게 접근할 수 있다. 단, 배열의 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존의 요소를 옮겨야 하는 복잡한 과정이 수행된다. 따라서 배열의 크기가 큰 경우, 혹은 수시로 배열의 값을 변경해야 하는 경우 ArrayList를 선택하는 것은 적합하지 않을 수 있다. (작업 시간이 매우 길어질 수 있기 때문)
LinkedList<E> 클래스
JDK 1.2부터 제공된 LinkedList 클래스는 ArrayList 클래스가 가지는 단점을 극복하기 위해 고안되었다. LinkedList는 배열을 이용하는 ArrayList와 달리 내부적으로 연결 리스트(linked list)를 이용해 요소를 저장한다.
저장된 요소가 순차적으로 저장되는 배열과는 달리 연결 리스트는 저장된 요소가 비순차적으로 분포되는데 이러한 요소 각각에 링크를 두어 순차를 구성한다. 즉, 각각의 데이터가 다음 데이터를 가리키는 참조 값이 존재하는 것이다. 이렇게 다음 요소를 가리키는 참조만을 가지는 연결 리스트를 단일 연결 리스트(singly linked list)라고 한다.
단일 연결 리스트는 요소의 저장과 삭제 작업이 매우 빠르다는 특징이 있다. 그러나 다음 요소에 대한 참조값만을 지니기 때문에 현재 요소에서 이전 요소로는 접근하기가 매우 까다롭다는 한계점을 지닌다. 이를 극복하기 위한 리스트가 이중 연결 리스트(doubly linked list)로 이 경우 한 개의 요소는 다음 요소와 함께 이전 요소에 대한 참조값을 지닐 수 있게 된다.
Vector<E> 클래스
JDK 1.0부터 사용되어 온 Vector 클래스는 ArrayList 클래스와 같은 동작을 수행한다. 현재의 Vector는 ArrayList와 마찬가지로 List 인터페이스를 상속받으며, 따라서 Vector 클래스에서 사용할 수 있는 메소드는 ArrayList 클래스에서 사용할 수 있는 메소드와 거의 같다.
Vector 클래스는 기존 코드와의 호환성을 위해 남아 있는 클래스이기 때문에 프로젝트를 수행할 때는 Vector보다 ArrayList를 사용하는 것이 권장된다.
List 인터페이스 메소드
메소드 | 설명 |
boolean add(E e) | 해당 리스트에 전달된 요소를 추가함. |
void add(int index, E e) | 해당 리스트의 특정 위치에 전달된 요소를 추가함. |
void clear() | 해당 리스트의 모든 요소를 제거함. |
boolean contains(Object o) | 해당 리스트가 전달된 객체를 포함하고 있는지 확인함. |
boolean equals(Object o) | 해당 리스트와 전달된 객체가 같으니를 확인함. |
E get(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 반환함. |
boolean isEmpty() | 해당 리스트가 비어있는지를 확인함. |
Iterator<E> iterator() | 해당 리스트의 반복자(iterator)를 반환함. |
boolean remove(Object o) | 해당 리스트에서 전달된 객체를 제거함. |
boolean remove(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 제거함 |
E set(int index, E e) | 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. |
int size() | 해당 리스트의 요소의 총 개수를 반환함. |
Object[] toArray() | 해당 리스트의 모든 요소를 Object 타입의 배열로 반환함. |
참고 페이지
'국비학원' 카테고리의 다른 글
[중간점검] 자바 국비학원 50% 진행상황 후기 (0) | 2021.12.14 |
---|---|
자바 국비 3주차 과제 (0) | 2021.09.21 |