컬렉션 프레임 워크란?
- 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음
컬렉션의 특성에 따라 크게 List, Set, Map으로 나눌 수 있고 메모리의 입출력 특성에 따라 기존 컬렉션 기능을 확장한 Stack, Queue가 있다.
Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.
1. List<E> 컬렉션 인터페이스
- 배열과 반대로 저장 공간의 크기가 동적으로 변화(메모리 동적 할당)
- 데이터의 추가, 변경, 삭제 등 가능
- 내부에 이미 클래스가 구현되어 있어 직접 인터페이스를 구현할 필요가 없음
- 구현 클래스(ArrayList<E>, Vector<E>, LinkedList<E>..)를 이용하면 List<E> 객체 생성 가능
- 구현 클래스(자식 클래스) 내부에는 메서드들이 구현되어 있음
ArrayList<E> 구현 클래스
- List<E> 인터페이스를 구현한 구현 클래스
- 배열처럼 수집한 원소를 인덱스로 관리하며 저장 용량을 동적 관리
- 데이터를 위치 정보(인덱스)와 값으로 저장
- 데이터 삽입, 삭제 시 해당 데이터 이후 모든 데이터가 복사되므로 빈번한 삭제, 삽입이 일어나는 경우에는 부적합하다.
- 검색의 경우는 인덱스의 데이터를 가져오면 되므로 빠르다.
Vector<E> 구현 클래스
- ArrayList 와 동일한 기능 수행
- 주요 메서드가 동기화 메서드로 구현돼 있어 멀티 쓰레드에 적합
- 무겁고 많은 리소스를 차지하므로 싱글쓰레드에서는 ArrayList를 쓰는 것이 효율적
LinkedList<E> 구현 클래스
- ArrayList 처럼 메서드를 동기화하지 않아 싱글 쓰레드에서 사용하기에 적합
- 저장 용량을 매개변수로 갖는 생성자가 없어 객체 생성 시 저장 용량 지정 불가능
- 양방향 포인터 구조로 앞뒤 객체의 정보를 저장, 모든 데이터가 서로 연결된 형태로 관리
- 데이터의 삽입, 삭제 시 해당 노드의 주소지만 바꾸면 되므로 삽입, 삭제가 빈번한 데이터에 적합하다.
- 양옆의 정보만을 갖고 있기 때문에 순차적으로 검색을 진행하여 검색 속도가 느리다.
ArrayList와 LinkedList의 성능 비교
- 특정 인덱스에 데이터 삽입 시
- ArrayList: 밀려나는 모든 데이터의 인덱스를 수정해야 함
- LinkedList: 값이 추가된 위치의 앞 뒤 데이터 정보만 수정하면 됨
- 특정 인덱스 위치의 값을 가져올 때
- ArrayList: 데이터 자체가 인덱스 번호를 가지고 있어 빠르게 찾을 수 있음
- LinkedList: 앞 부터 차례대로 인덱스의 위치를 찾아야함
데이터 추가/삭제 시 LinkedList, 데이터 검색 시 ArrayList 사용하는 것이 효율적
2. Set<E> 컬렉션 인터페이스
- 인덱스 정보를 포함하고 있지 않은 집합의 개념과 같은 컬렉션
- 데이터를 구분할 수 있는 방법이 데이터 그 자체
- 동일한 데이터의 중복 저장을 허용하지 않음
- List 메서드와 비교해 인덱스가 포함된 메서드가 모두 사라진 형태
HashSet<E> 구현 클래스
- 저장 용량을 동적 관리
- 저장 순서를 유지하지 않는 데이터의 집합
- 기본 생성자로 생성시 기본 값 16, 데이터 개수가 많아지면 동적 증가
- 입력 순서와 다르게 출력될 수 있음
- 중복 확인 메커니즘: 해시 코드 동일한지 확인 -> equals() 결과가 true인지 확인
LinkedHashSet<E> 구현 클래스
- HashSet의 자식 클래스로 HashSet의 모든 기능에 데이터 간의 연결 정보만을 추가로 갖는 컬렉션
- 입력 순서의 정보를 갖고 있어 출력 순서가 입력 순서와 동일(저장 순서를 유지)
- 중간에 데이터 추가하거나 특정 순서의 값을 가져오는 것은 불가능
TreeSet<E> 구현 클래스
- Set의 기능에서 정렬 및 검색 기능 추가
- TreeSet<E>으로 선언해야 부모 인터페이스인 SortedSet, NavigableSet에서 추가된 정렬및 검색 메서드 호출 가능
- 데이터를 입력 순서와 상관없이 크기순으로 출력
- 저장되는 모든 객체는 크기 비교의 기준이 제공돼야 함
- Comparable<T> 제네릭 인터페이스 구현하는 방법
- 객체를 생성하면서 생성자 매개변수로 Comparator<T> 객체를 제공 하는 방법
3. Map<K, V> 컬렉션 인터페이스
- List, Set이 Collection<E> 인터페이스를 상속받는 반면, 별도의 인터페이스로 존재
- Key와 Value 한 쌍으로 데이터를 저장
- Key는 중복 저장 불가, Value는 중복 가능
HashMap<K, V>
- Key 값 중복 허용 x, 입출력 순서 불일치
- 단일 쓰레드에 적합
- Key값을 HashSet으로 구현한 Map 객체
- key값 중복 여부는 hashCode()값, equals() true인지 비교
HashTable<K, V>
- Key 값 중복 허용 x, 입출력 순서 불일치
- 주요 메서드가 동시화 메서드로 구현돼 멀티 쓰레드에 안정성을 가짐
LinkedHashMap<K, V>
- HashMap의 기본적인 특성에 입력 데이터의 순서 정보를 추가로 갖는 컬렉션
- 입출력 순서 일치
- Key를 LinkedHashSet으로 관리
TreeMap<K, V>
- Map의 기본 기능에 정렬 및 검색 기능이 추가된 컬렉션
- NavigableMap<E>, SortedMap<E> 인터페이스의 자식 클래스
- 입력 순서와 관계없이 데이터를 Key 값의 크기 순으로 저장(오름차순)
4. Stack <E> 컬렉션 클래스
- 5개의 컬렉션 중 유일한 클래스로 자체적으로 객체 생성 가능
- Vector 클래스의 자식 클래스로 후입선출 자료구조를 구현한 컬렉션
5. Queue<E> 컬렉션 인터페이스
- LinkedList가 Queue 인터페이스의 구현 클래스
- 선입선출 구조를 가짐
'BACK > JAVA' 카테고리의 다른 글
[JAVA] ArrayList.indexOf() 사용법 (0) | 2023.03.31 |
---|---|
[JAVA] 문자열 배열을 길이 순으로 정렬하기 (0) | 2023.03.04 |
[JAVA] replaceAll 정규식 사용하기 (0) | 2022.12.19 |
객체지향 프로그래밍의 특징 (0) | 2022.11.13 |
[JAVA] 자바 프로그램의 구조와 실행 과정 (0) | 2022.11.11 |