[컬렉션 프레임워크]
■ 컬렉션 프레임워크 : 기존에 존재했던 자료 구조에 인터페이스로 설계된 기능을 클래스를 통해 제공하여 데이터 관리에 용이한 자료 구조 객체를 구조화한 것
- 필요한 자료구조를 미리 구현하여 java.util 패키지에서 제공
□ 컬렉션: 리스트, 큐, 트리 등의 자료구조
□ 프레임워크 : 클래스와 인터페이스를 묶어 놓은 개념
인터페이스 | 설명 | 특징 | 대표 구현 클래스 |
List | 순서가 있는 데이터의 집합 | 데이터 중복 허용 O | ArrayList, LinkedList |
Set | 순서를 유지하지 않는 데이터의 집합 | 데이터 중복 허용 X | HashSet, LinkedHashSet |
Map | 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합 | 순서 유지 X, 키 중복 X, 값 중복 O | HashMap, LinkedHashMap, Properties |
- List와 Set 인터페이스는 모두 컬렉션 인터페이스를 상속받지만 Map은 별도로 정의
[제네릭]
: 데이터의 타입을 일반화하여 사용할 데이터 타입을 컴파일 할 때 미리 지정
- 타입 검사나 변환과 같은 번거로운 작업 생략 가능 및 데이터 타입의 안정성을 높일 수 있음
- 타입을 파라미터로 가지는 클래스와 인터페이스
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
- <T> : 타입 변수. 타입을 제한하는 역할.
- 객체 생성 시 해당 클래스는 지정된 객체만들 저장할 수 있고, 따로 타입 변환할 필요 없이 데이터 출력 가능
- 하나의 객체로 다양한 데이터 사용 가능
<T> | Type |
<E> | Element |
<K> | Key |
<N> | Number |
<V> | Value |
[List 컬렉션]
: 배열과 유사한 자료 구조.
- 중복 허용, 저장 순서 유지.
- 배열처럼 index를 통해 데이터를 저장하고 찾는다.
- 배열과 달리 크기의 제한이 없고 삽입, 삭제, 변경의 기능이 자유로움 -> 데이터 크기를 특정할 수 없는 다량의 데이터를 저장할 때 용이하게 사용할 수 있다.
- 대표적으로 List 인터페이스를 상속해 구현한 ArrayList, LinkedList, Vector 등을 사용
※ List가 제공하는 주요 메서드
void add (E e) | 삽입 | 데이터를 순차 삽입 |
void add(int index, E e) | 중간 삽입 | 원하는 인덱스 위치에 삽입 |
void set(int index, E e) | 치환 | 원하는 인덱스 위치의 값 변경 |
E get(int index) | 반환 | 선택된 인덱스 위치의 값 반환 |
void remove(int index) | 삭제 | 선택된 인덱스 위치의 값 삭제 |
void clear() | 전체 삭제 | 모든 데이터 삭제 |
int size() | 크기 | 저장된 데이터의 개수 반환 |
boolean contains(Object o) | 검색 | 데이터 존재 여부 확인 |
- 삭제의 경우 데이터만 삭제되는 것이 아니라 해당 위치 공간까지 삭제됨
① ArrayList
List <데이터 타입(제네릭)> list = new ArrayList <데이터 타입> ();
- 배열과 호환성이 좋음
- 데이터 타입은 항상 객체형(Wrapper 클래스) 으로 지정
② LinkedList : 데이터와 다음 데이터의 주소를 가지는 노드(node) 객체가 연결되어 데이터를 저장하는 자료구조
- ArrayList는 배열을 이용해 데이터를 저장하고, LinkedList는 node라는 객체를 생성해서 인접 데이터를 링크하여 체인처럼 관리한다.
- node라는 구조를 가진 클래스들이 체인 형식으로 이어져 있음
- node : 데이터 값, 주소를 가짐. (주소는 다음에 오는 노드의 값을 가져서 연결 구조)
- 인덱스가 존재하지 않아도 서로 연결되어 있어 순서를 알 수 있다.
List<Integer> list = new LiknedList<Integer>();
List<Integer> list = new LinkedList<();
또는
LinkedList<Integer> list = new LinkedList<Integer>();
LinkedList<Integer> list = new LinkedList<>();
- 메서드는 ArrayList와 비슷하다.
※ LinkedList 데이터 저장 : 데이터 추가 시 기존에 연결되어 있던 링크를 끊고, 추가되는 데이터에 새롭게 주소를 연결. 또한, 추가되는 노드는 뒤에 올 데이터와 링크하여 삽입한다.
- 노드가 갖고 있는 다음에 오는 개체의 주소만 변경하면 되므로 ArrayList보다 빠르다.
※ 데이터 삭제: 삭제된 데이터의 공백을메우기 위해 이후 데이터들을 모두 앞으로 이동시키는 ArrayList와 달리, LinkedList는 삭제할 데이터와의 연결을 끊고 그 뒤의 데이터와 연결하여 쉽게 데이터를 삭제할 수 있다.
==> ArrayList는 연속성 있게 데이터를 추가하고(나열 저장), 출력 속도가 빠르지만 특정 위치에 삽입/삭제하는 기능은 LinkedList가 더 좋다. 삽입과 삭제가 빈번할 땐 LinkedList를 쓰자!
[Set 컬렉션] : HashSet, TreeSet, LinkedHashSet
- 객체 저장 순서를 저장하지 않음. 데이터 중복도 허용 X, 인덱스 부여하지 않아서 데이터가 입력된 순서로 출력된다는 보장도 없음
void add(E e) | 데이터를 순차적으로 삽입 |
void remove(Object o) | 선택된 값 삭제 |
void clear() | 모든 데이터 삭제 |
int size() | 저장된 데이터의 개수 반환 |
boolean contains(Object o) | 데이터 존재 여부 확인 |
① HashSet 클래스
- 인터페이스 상속받아 구현
Set<E> set = new HashSet<E>();
Set<E> set = new HashSet<>();
※ HashSet 데이터 저장 : 동일한 값 또는 객체 허용 X. 객체의 hassCode() 값을 호출해 비교하고 같으면 equals() 메서드를 호출하여 다시 비교한 후 같은 객체임을 증명한다.
- HashSet에 객체를 저장해야 한다면 해당 객체는 hashCode와 equals 메서드를 사용해 비교하는 로직 필요
※ HashSet 데이터 삭제 : 인덱스가 존재하지 않으므로 순서에 의한 삭제 지원 X
[반복자 Iterator]
: List 컬렉션의 요소를 순회하여 하나씩 추출하는데 사용.
- 반복자라고도 불리며, Iterator 객체는 선언된 컬렉션 객체에서 가져와 사용한다.
boolean hashNext() | 다음에 순회할 데이터 유무 확인. 가져올 객체가 있으면 true, 없으면 false 반환 |
E next() | 다음 위치의 데이터로 이동하여 반환 |
[Map 컬렉션] : HashMap, TreeMap, LinkedHashMap
: Map은 List, Set과 달리 Map 인터페이스가 별도로 존재하며, 데이터를 List 계열 컬렉션과 다르게 처리한다.
□ "Key - Value" 방식 사용
- key는 중복될 수 없지만, value는 중복 가능
- Map의 key와 value는 Entry라는 인터페이스를 상속한 객체에 저장된다.
- 검색을 요구하는 데이터를 저장하는데 효과적이지만, 데이터를 저장하고 삭제할 때는 다소 느리다.
void put(K key, V value) | key에 대응하는 value 저장 |
E get(K key) | key에 대응하는 value 반환 |
boolean containsKey(K key) | key 존재 여부 검색 |
boolean containsValue(V value) | value whswo duqn rjator |
Set<E> keySet() | 모든 key를 Set 컬렉션에 저장하여 반환 |
Set<Map.Entry> entrySet() | 모든 Map.Entry 객체를 Set에 담아 반환 |
① HashMap<K,V>
- HashSet처럼 key로 지정된 객체의 hashCode와 equals 메서드를 이용해 동일 여부 판단
- key 중복 불가. 중복된 key가 들어오면 기존 key가 지닌 데이터를 업데이트하게 된다.
Map <KEY, V> map = new HashMap<KEY, V>();
Map <KEY, V> map = new HashMap<>();
'IT > JAVA' 카테고리의 다른 글
Java Section 18 : 스레드 (1) | 2025.01.25 |
---|---|
Java Section 17 : 람다식 (0) | 2025.01.24 |
Java Section 15 : 기본 API 클래스 (1) | 2025.01.22 |
Java Section 14 : 예외처리 (1) | 2025.01.21 |
[DAY 14] 컬렉션 프레임워크 (1) | 2025.01.21 |