컬렉션 프레임워크
인터페이스 분류 | 특징 | 구현 클래스 | |
Collection | List | - 순서를 유지하고 저장 - 중복 저장 가능 |
ArrayList, Vector, LinkedList |
Set | - 순서를 유지하고 저장 - 중복 저장 불가능 |
HashSet, TreeSet | |
Map | - 키와 값으로 구성된 엔트리 저장 - 키는 중복 저장 안됨 |
HashMap, Hashtable, TreeMap, Properties |
List 컬렉션
List컬렉션은 인덱스로 관리한다.
기능 | 메소드 | 설명 |
객체 추가 |
boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 | |
set(int index, E element) | 주어진 인덱스의 객체를 새로운 객체로 바꿈 | |
객체 검색 |
boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
E get(int index) | 주어진 인덱스에 저장된 객체 리턴 | |
isEmpty() | 컬렉션이 비어있는지 검사 | |
int size() | 저장되어 있는 전체 객체 수 리턴 | |
객체 삭제 |
void clear() | 저장된 모든 객체 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
ArrayList
- List컬렉션 중 가장 많이 사용
- ArrayList에 add로 객체 추가 시 배열에 객체가 저장되며, 일반 배열과 달리 길이 제한이 없다.
- 객체 자체가 아닌 객체의 번지를 저장한다. 동일한 객체 저장도 가능하며, 동일한 번지가 저장된다.
//생성방법
ArrayList<E> list = new ArrayList<E>(); //지정된 E타입 객체만 저장 가능
ArrayList<E> list = new ArrayList<>(); //지정된 E타입 객체만 저장 가능
ArrayList list = new ArrayList(); //모든 타입 객체 저장 가능
* 특정 index 객체를 제거하면 바로 뒤부터 끝까지 모두 앞으로 한 칸씩 당겨진다.
* 특정 index에 객체를 추가하면 해당 인덱스부터 끝까지 뒤로 한 칸씩 밀려진다.
Vector
ArrayList와 동일한 내부 구조를 가졌지만 Vector는 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없다.
=> 멀티 스레드 환경에서 안전하게 객체 추가/삭제가 가능하다.
//생성 방법
List<E> list = new Vector<E>(); //E타입 객체만 저장
List<E> list = new Vector<>(); //E타입 객체만 저장
List<> list = new Vector<>(); //모든 타입 객체 저장
=>코드에 여러 스레드가 있어 thread1.start(); thread2.start();해도 한 번에 하나의 스레드만 실행시킨다.
LinkedList
LinkedList는 ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다. ArrayList는 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.
- 특정 위치에서 객체를 삽입/삭제하면 바로 앞 뒤 링크만 변경되므로 빈번한 삽입/삭제에서는 ArrayList보다 좋다.
//생성 방법
List<E> list = new LinkedList<E>(); //E타입 객체만 저장
List<E> list = new LinkedList<>(); //E타입 객체만 저장
List<> list = new LinkedList<>(); //모든 객체 저장
Set 컬렉션
List와 달리 Set은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.
기능 | 메소드 | 설명 |
객체 추가 |
boolean add(E e) | 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴 |
객체 검색 |
boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
isEmpty() | 컬렉션이 비어 있는지 조사 | |
Iterator<E> iterator() | 저장된 객체를 한 번씩 가져오는 반복자 리턴 | |
int size() | 저장된 객체 수 리턴 | |
객체 삭제 |
void clear() | 저장된 모든 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
HashSet
- Set컬렉션 중 가장 많이 사용되는 것
//생성 방법
Set<E> set = new HashSet<E>(); //E타입 객체만 저장
Set<E> set = new HashSet<>(); //E타입 객체만 저장
Set<> set = new HashSet<>(); //모든 타입 객체 저장
=>HashSet은 hashCode()의 리턴값이 같고 equals()메소드가 true를 리턴하면 동등한 객체로 보고 중복 저장하지 않는다.
* Set은 index가 없어 객체를 검색해서 가져오는 방법이 없다. 그래서 2가지 방법을 이용한다.
//Set에서 객체를 가져오는 방법
//1.for문 이용
Set<E> set = new HashSet<>();
for (E e:set){
...
}
//2.Iterator이용
Set<E> set = new HashSet<>();
Iterator<E> iterator = set.iterator();
리턴타입 | iterator 메소드명 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true, 없으면 false |
E | next() | 컬렉션에서 하나의 객체를 반환 |
void | remove() | next()로 가져온 객체를 Set컬렉션에서 제거한다. |
//사용 방법
while(iterator.hasNext()){
E e = iterator.next();
}
Map 컬렉션
Map 컬렉션은 키(key)와 값(value)으로 구성된 엔트리 객체를 저장한다. 여기서 키와 값은 모두 객체이다.
키 - 중복저장 불가능
값 - 중복저장 가능
기능 | 메소드 | 설명 |
객체 추가 | V put(K key, V value) | 주어진 키와 값을 추가, 저장되면 값을 리턴 |
객체 검색 | boolean containsKey(Object key) | 주어진 키가 있는지 여부 |
boolean containsValue(Object Value) | 주어진 값이 있는지 여부 | |
Set<Map.Entry<K,V>> entrySet() | 키,값 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 | |
V get(Object key) | 주어진 키의 값을 리턴 | |
boolean isEmpty() | 컬렉션이 비어있는지 여부 | |
Set<K> keySet() | 모든 키를 Set객체에 담아 리턴 | |
int size() | 저장된 키의 총 수를 리턴 | |
Collection<V> values() | 저장된 모든 값 Collection에 담아서 리턴 | |
객체 삭제 | void clear() | 모든 Map.Entry(키와 값)을 삭제 |
V remove(Object key) | 주어진 키와 일치하는 Map.Entry 삭제. 삭제되면 값을 리턴 |
HashMap
키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우, 동일 키로 보고 중복 저장을 허용하지 않는다.
//생성 방법
Map<K,V> map = new HashMap<K,V>();
Map<K,V> map = new HashMap<>();
Hashtable
Hashtable은 HashMap과 동일한 내부 구조를 갖고 있다. 차이점으로는 Hashtable은 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없다.
따라서 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.
Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hahtable<>();
Properties
Hashtable의 자식 클래스이기 때문에 Hahtable의 특징을 그대로 갖고 있다. Properties는 키와 값을 String으로 제한한 컬렉션이다.
주로 .properties인 프로퍼터 파일을 읽을 때 사용한다.
//database.properties
driver=oracle.jdbc.OracleDirver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9
Properties properties = new Properties();
properties.load(Xxx.class.getResourceAsStream("database.properties"));
검색 기능을 강화시킨 컬렉션
컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet, TreeMap을 제공한다.
TreeSet
- 이진트리를 기반으로 한 Set컬렉션
TreeSet에 객체를 저장할 때는 부모 노드의 객체와 비교해 낮은 것은 왼쪽 자식에, 높은 것은 오른쪽 자식 노드에 저장한다.
//생성 방법
TreeSet<E.=> treeSet = new TreeSet<E>;
TreeSet<E.=> treeSet = new TreeSet<>;
TreeMap
이진트리를 기반으로 한 Map 컬렉션. TreeSet과의 차이점은 키와 값이 저장된 Entry를 저장한다는 점이다.
TreeMap에 엔트리를 저장하면 키를 기준으로 자동 정렬되는데 부모 키값보다 낮은건 왼쪽, 큰 건 오른쪽 자식 노드에 Entry객체를 저장한다.
TreeMap<K,V> treeMap = new TreeMap<K,V>();
TreeMap<K,V> treeMap = new TreeMap<>();
Comparable과 Comparator
TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체는 저장과 동시에 오름차순으로 정렬되는데,
객체가 Comparable 인터페이스를 구현하고 있어야 가능하다. Comparable인터페이스를 받아 compareTo()를 재정의해야한다.
리턴 타입 | 메소드 | 설명 |
int | compareTo(T o) | 주어진 객체와 같으면 0, 크면 양수, 작으면 음수 리턴 |
Comparable 비구현 객체를 저장하고 싶다면 TreeSet과 TreeMap을 생성할 때 비교자(Comparator)를 제공하면 된다.
TreeSet<E> treeSet = new TreeSet<E>(new ComparatorImpl));
TreeMap<K,V> treeMap = new TreeMap<K,V>(new ComparatorImpl());
LIFO와 FIFO 컬렉션
LIFO(Last In First Out): 후입선출 => 스택
FIFO(First in First Out): 선입선출 =>
Stack
//스택 생성 방법
Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();
리턴 타입 | 메소드 | 설명 |
E | push(E item) | 주어진 객체를 스택에 넣는다. |
E | pop() | 스택의 맨 위 객체를 빼낸다 |
Queue
//큐 생성 방법
Queue<E> queue = new LinkedList<E>();
Queue<E> queue = new LinkedList<>();
리턴 타입 | 메소드 | 설명 |
boolean | offer(E e) | 주어진 객체를 큐에 넣는다. |
E | poll() | 큐에서 객체를 빼낸다. |
'IT > JAVA' 카테고리의 다른 글
[JAVA] #17 스트림 요소 처리 (0) | 2023.05.01 |
---|---|
[JAVA] #16 람다식 (0) | 2023.04.27 |
[JAVA] #14 멀티 스레드 (0) | 2023.04.26 |
[JAVA] #13 제네릭 (0) | 2023.04.24 |
[JAVA] #12 java.base 모듈 (0) | 2023.04.20 |