컬렉션 프레임워크
- 자료구조를 사용해서 객체들을 효율적으로 관리할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에서 제공함
- 프레임워크: 사용방법을 정해놓은 라이브러리
- 주요 인터페이스로 List, Set, Map이 있음

List 컬렉션
- 저장 용량이 자동적으로 증가, 객체를 저장할 때 자동 인덱스 부여
- 객체 자체를 저장하는 것이 아니라 객체 번지를 참조(중복 저장 시 동일한 번지 참조)
List<String> list = ...;
list.add("홍길동");
list.add(1, "신용권");
String str = list.get(1);
list.remove(0);
list.remove("신용권");
ArrayList
- 객체 추가 시 0번 인덱스부터 차례대로 저장
- 객체 제거 시 바로 뒤 인덱스부터 마지막 인덱스까지 모두 1씩 당겨짐
- 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 LinkedList 권장
Vector
- 저장할 객체 타입을 타입 파라미터로 표기하고 기본 생성자 호출하여 생성
List<E> list = new Vector<E>();
List<E> list = new Vector<>();
- 동기화 된 메소드로 구성되어 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고, 하나의 스레드가 메소드 실행 완료해야만 다른 스레드가 메소드 실행할 수 있음
- 멀티 스레드 환경에서 안전하게 객체 추가 및 삭제할 수 있음(스레드에 안전 thread safe)

LinkedList
- ArrayList와 사용 방법은 같으나 내부 구조가 다름
- 인접 참조를 링크해서 체인처럼 객체를 관리
- 특정 인덱스 객체 제거하거나 삽입하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않음

Set 컬렉션
- 저장 순서가 유지되지 않으며, 객체를 중복하여 저장할 수 없고, 하나의 null만 저장할 수 있다.
- 수학의 집합과 유사
- 구현 클래스 - HashSet, LinkedHashSet, TreeSet


- Set 컬렉션에 객체 저장 및 삭제
Set<String> set = ...;
set.add("hyeKjung"); //객체 추가
set.add("홍길동");
set.remove("hyeKjung"); //객체 삭제
Iterator() 메소드 호출하여 반복자 얻고, 반복자로 검색 기능 대체
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
- Iterator 인터페이스 메소드

- String 객체들 반복해서 하나씩 가져오기
Set<String> set = ...;
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){ //저장된 객체 수 만큼 루핑
//String 객체 하나를 가져옴
String str = iterator.next();
}
HashSet
- Set 인터페이스의 구현 클래스
- 기본 생성자 호출하여 생성
Set<E> set = new HashSet<E>();
Set<String> set = new HashSet<String>();
Set<String> set = new HashSet<>
- 객체를 순서 없이 저장하되 지정된 객체와 동등 객체는 중복 저장하지 않음
- 동등 객체 판단 방법

Map 컬렉션
- 키와 값으로 구성된 Entry 객체를 저장하는 구조
- 키는 중복 저장될 수 없으나 값은 중복 저장될 수 있음
기존 저장된 키와 동일한 키로 값을 저장하면 기존 값 없어지고 새로운 값으로 대체

- Map 인터페이스 구현 클래스 - HashMap, Hashtable, LinkedHashMap, Properties, TreeMap
- Map 인터페이스 메소드

Map<String, Integer> map = ...;
map.put("홍길동", 30); //객체 추가
int score = map.get("홍길동"); //객체 찾기
map.remove("홍길동"); //객체 삭제
HashMap
- 대표적인 Map 컬렉션
- HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드 재정의하여 동등 객체가 될 조건 정해야함
hashCode() 리턴값 같고 equals() 메소드 true 리턴해야 함

- HashMap 생성하려면 키 타입과 값 타입을 타입 파라미터로 주고 기본 생성자 호출
Map<K, V> map = new HashMap<K, V>();
Hahtable
- HashMap과 동일한 내부 구조
- 동기화된 메소드로 구성되어 멀티 스레드가 동시에 Hashtable 메소드 실행할 수 없으며, 하나의 스레드가 실행을 완료해야만 다른 스레드 실행할 수 있음
- 키로 사용할 객체를 hashCode()와 equals() 메소드 재정의하여 동등 객체 될 조건 정해야 함

Map<K, V> map = new Hahtable<K, V>();
정리
- 컬렉션 프레임워크: 널리 알려진 자료구조 사용하여 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에서 제공하는데 이들을 총칭하여 컬렉션 프레임워크라 한다.
- List 컬렉션: List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리한다. 차이점은 저장용량이 자동으로 증가하여 객체 저장 시 자동 인덱스 부여된다는 것이다. 또한 추가, 삭제, 검색을 위한 다양한 메소드가 제공된다.
- Set 컬렉션: Set 컬렉션은 저장 순서 유지되지 않으며, 객체를 중복해서 저장할 수 없고, 하나의 null만 지정할 수 있다.
- Map 컬렉션: Map 컬렉션은 키와 값으로 구성된 Map Entry 객체를 저장하는 구조를 가지고 있으며, 여기서 키와 같은 모두 객체이다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다.