Java
에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 인터페이스
를 의미한다. 다음은 JCF의 상속 구조이며 사용 용도에 따라 List, Set, Map 3가지로 요약할 수 있다.
📖 컬렉션(Collection)은 여러 요소들을 담을 수 있는 자료구조다. 즉, 다수의 데이터 그룹이며 다른 말로 컨테이너(Container)라고도 부른다. 배열과 비슷하지만 크기가 고정된 배열을 보완하여 Re-sizable 한 특성을 가진다.
📖 컬렉션 프레임워크는 아래 나열된 배열의 문제점을 해결하기 위해 등장하였다.
1. 배열은 선언과 동시에 배열의 크기가 초기화 되고 이후에 변경이 불가능하다.
2. 데이터를 검색하는 과정에서 시간이 많이 걸린다.
✍ 배열의 크기가 작은 경우가 아니면 탐색에 오래 걸린다.
3. 같은 기본형 데이터 타입의 자료형만 저장할 수 있다.
인터페이스 | 구현 클래스 | 특징 |
---|---|---|
List | LinkedList Stack Vector ArrayList | 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다. |
Set | HashSet TreeSet | 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다 |
Map | HashMap TreeMap HashTable Properties | 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다. 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다. |
✍ Collection
을 확장한 다른 인터페이스와 큰 차이는 없으나, 배열처럼 순서
가 있다는 점에서 큰 차이가 있다.
ArrayList
, Vector
, Stack
, LinkedList
가 있다.
ArrayList
, Vector
클래스의 사용법은 거의 동일하고 기능도 거의 비슷하다. 확장 가능한 배열
이라고 생각하면 이해가 쉽다.
📖
ArrayList
와Vector
의 차이점
ArrayList
는 Not Thread Safe
Vector
는 Thread Safe📖
Stack
Vector
클래스를 확장하여 만들었으며, 만든 이유는 LIFO를 지원하기 위함이다.
📖LinkedList
는 "목록"에도 속하지만, "큐"에도 속한다.
📖 ArrayList의 상속 관계
java.lang.Object
↳java.util.AbstractCollecion<E>
↳java.util.AbstractList<E>
↳java.util.Arraylist<E>
📖 ArrayList가 구현한 인터페이스
Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,List<E>
,RandomAccess
인터페이스 | 용도 |
---|---|
Serializble | 원격으로 객체를 전송하거나, 파일에 저장할 수 있음을 지정 |
Cloneable | Object 클래스의 clone() 메소드가 제대로 수행될 수 있음을 지정 즉, 복제가 가능한 객체임을 의미한다. |
Iterable<E> | 객체가 "foreach" 문장을 사용할 수 있음을 지정 |
Collection<E> | 여러 개의 객체를 하나의 객체에 담아 처리할 때의 메소드 지정 |
List<E> | 목록형 데이터를 처리하는 것과 관련된 메소드 지정 |
RandomAccess | 목록형 데이터 보다 빠르게 접근할 수 있도록 임의로 접근하는 알고리즘이 적용된다는 것을 지정 |
public void checkArrayList() {
// String 타입의 객체만 넣을 수 있는 ArrayList
ArrayList<String> list = new ArrayList<>();
// 객체를 선언할 때, 크기를 별도로 지정하지 않으면 초기 크기는 10
}
제네릭<>
을 사용하면 컴파일 시점에 타입을 잘못 지정한 부분을 1차로 걸러낼 수 있다.
앞서 언급하였지만, Vector
는 ArrayList
와 메소드는 약간 상이하고,
ArrayList는 Not Thread Safe, Vector는 Thread Safe하다는 차이가 있다.
ArrayList
를 Thread Safe
하게 사용하고자 한다면 아래와 같이 객체를 생성해야 한다.
List list = Collections.synchronizedList(new ArrayList(...));
List Interface
를 구현한 또 하나의 클래스로 목록과 FIFO 기능을 구현 할 때 필요한 클래스 구현체이다.
📖 LinkedList 상속 관계
java.lang.Object
↳java.util.AbstractCollecion<E>
↳java.util.AbstractList<E>
↳java.util.AbstractSequentialList<E>
↳java.util.LinkedList<E>
인터페이스 | 용도 |
---|---|
Serializble | 원격으로 객체를 전송하거나, 파일에 저장할 수 있음을 지정 |
Cloneable | Object 클래스의 clone() 메소드가 제대로 수행될 수 있음을 지정 즉, 복제가 가능한 객체임을 의미한다. |
Iterable<E> | 객체가 "foreach" 문장을 사용할 수 있음을 지정 |
Collection<E> | 여러 개의 객체를 하나의 객체에 담아 처리할 때의 메소드 지정 |
Deque<E> | 맨 앞과 맨 뒤의 값을 용이하게 처리하는 큐와 관련된 메소드 지정 |
List<E> | 목록형 데이터를 처리하는 것과 관련된 메소드 지정 |
Queue<E> | 큐를 처리하는 것과 관련된 메소드 지정 |
📌 LinkedList
는 List
와 Queue
그리고 Dequeue
인터페이스를 구현하고 있다.
📖 주요 메소드(데이터 삽입)
return type | method & args | description |
---|---|---|
void boolean void | addFirst(Object) offerFirst(Object) push(Object) | LinkedList 객체의 가장 앞에 데이터를 추가한다. |
boolean void boolean boolean | add(Object) addLast(Object) offer(Object) offerLast(Object) | LinkedList 객체의 가장 뒤에 데이터를 추가한다. |
void | add(int, object) | LinkedList 객체의 특정 위치에 데이터를 추가한다. |
Object | set(int, Object) | LinkedList객체의 특정 위치에 있는 데이터를 수정한다. 그리고 기존에 있던 데이터를 리턴한다. |
boolean | addAll(Collection) | 매개 변수로 넘긴 컬렉션의 데이터를 추가한다. |
boolean | addAll(int, Collection | 매개 변수로 넘긴 컬렉션의 데이터를 지정된 위치에 추가한다. |
📖 주요 메소드(데이터 조회)
return type | method & args | description |
---|---|---|
Object | getFirst() peekFirst() peek() element() | LinkedList 객체의 맨 앞에 있는 데이터를 리턴한다. |
Object | getLast() peekLast() | LinkedList 객체의 맨 뒤에 있는 데이터를 리턴한다. |
Object | get(int) | LinkedList 객체의 지정한 위치에 있는 데이터를 리턴한다. |
📖 주요 메소드(데이터 포함)
return type | method & args | description |
---|---|---|
boolean | contains(Object) | 매개 변수로 넘긴 데이터가 있을 경우 true를 리턴한다. |
int | indexOf(Object) | 매개 변수로 넘긴 데이터의 위치를 앞에서부터 검색하여 리턴한다. 없으면 -1을 리턴한다. |
int | lastIndexOf(Object) | 매개 변수로 넘긴 데이터의 위치를 끝에서부터 검색하여 리턴한다. 없으면 -1을 리턴한다. |
📖 주요 메소드(데이터 삭제)
return type | method & args | description |
---|---|---|
Object | remove() removeFirst() poll() pollFirst() pop() | LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴한다. |
Object | pollLast() removeLast() | LinkedList 객체의 가장 끝에 있는 데이터를 삭제하고 리턴한다. |
Object | remove(int) | 매개 변수에 지정된 위치에 있는 데이터를 삭제하고 리턴한다. |
boolean | remove(Object) removeFirstOccurrence(Object) | 매개 변수로 넘겨진 객체와 동일한 데이터 중 앞에서부터 가장 처음에 발견된 데이터를 삭제한다. |
boolean | removeLastOccurrence(Object) | 매개 변수로 넘겨진 객체와 동일한 데이터 중 끝에서부터 가장 처음에 발견된 데이터를 삭제한다. |
📖 주요 메소드(데이터 하나씩 검색)
return type | method & args | description |
---|---|---|
ListIterator | listIterator(int) | 매개 변수에 지정된 위치부터의 데이터를 검색하기 위한 ListIterator 객체를 리턴한다. |
Iterator | descendigIterator() | LinkedList의 데이터를 끝에서부터 검색하기 위한 Iterator 객체를 리턴한다. |
List Interface
를 구현한 또 하나의 클래스로 LIFO 기능을 구현 할 때 필요한 클래스이다. *** LIFO : Last In First Out
LIFO를 위해 사용하는 것을 권장하진 않는다. 다만, 사용하고자 한다면 Thread Safe에 맞게 사용하면 된다.
Stack : 상대적으로 성능이 떨어지지만,
Thread Safe
ArrayDeque : 상대적으로 성능이 좋지만,Not Thread Safe
📖 Stack 상속 관계
java.lang.Object
↳java.util.AbstractCollecion<E>
↳java.util.AbstractList<E>
↳java.util.Vector<E>
↳java.util.Stack<E>
Super Class
가 Vector
이므로 해당 클래스에서 제공하는 모든 메서드를 사용할 수 있다. 그리고 Stack
에서 구현한 인터페이스는 ArrayList 클래스에서 구현한 인터페이스와 모두 동일하다.
📖 Stack 클래스는 원래의 취지인 LIFO를 생각한다면 Vector에 속해서는 안된다. 하지만 자바의 하위 호환성을 위해 이 상속 관계를 유지하고 있다고 보면 된다.(JDK 1.0부터 속해왔음...)
📖 주요 메소드
return type | method & args | description |
---|---|---|
boolean | empty() | 객체가 비어 있는지 확인한다. |
E | peek() | 객체의 가장 위에 있는 데이터를 리턴한다. |
E | pop() | 객체의 가장 위에 있는 데이터를 지우고 리턴한다. |
E | push(E item) | 매개 변수로 넘어온 데이터를 가장 위에 저장한다. |
E | search(Object o) | 매개 변수로 넘어온 데이터의 위치를 리턴한다. |
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍