java.util
패키지 : 자바 프로그램에서 필요로 하는 편리한 기능을 모아둔 클래스들의 패키지
배열을 조작하는 기능을 가진 API
컬렉션 (Collection)
다수의 데이터, 즉 데이터 그룹을 의미
프레임워크 (Framework)
표준화, 정형화된 체계적인 프로그래밍 방식
컬렉션 프레임워크
컬렉션을 저장하는 클래스들을 표준화한 설계
컬렉션 클래스 (Collection Class)
다수의 데이터를 저장할 수 있는 클래스 (ex/ Vector, ArrayList, HashSet 등)
핵심 인터페이스
배열
Array
vs 리스트List
객체만 저장할 수 있음
Vector<T> v = new Vector<>();
- 생성자 : Vector() / Vector(int capacity)
- 개체 추가 : addElement(Object o) / insertElementAt(Object o, int index)
- 개체 참조 : elementAt(int index)
- 역개체참조 : indexOf(Object o) // -1 : 없음
- 개체 변경 : setElementAt(Object o, int index)
- 개체 삭제 : remove(Object o) / remove(int index);
- 객체 검색 : contains(Object o)
- 크기와 용량 : size() / capacity()
- 비우기 : clear()
- 복사 : clone()
반복자
자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용
반복자
Enumeration
백터와 해시테이블에 존재하는 요소들에 대한 접근방식을 제공해주는 인터페이스
java.util.Enumeration
Enumeration<T> e
:hasMoreElements(), nextElement()
제공// 순회 for (int i = 0 ; i < v.size(); ++i) { Integer item = v.elementAt(i); System.out.printf("%d ", item); } System.out.println(); // 반복자 활용 Enumeration<Integer> e = v.elements(); while (e.hasMoreElements()) { // 다음 요소가 있는지 확인 Integer item = e.nextElement(); System.out.printf("%d ", item); } System.out.println();
Vector::elements()
Hashtable::keys()
Hashtable::values()
반복자
Iterator
Collection Framework로 확장하면서 도입(List, Set 등)
java.util.Iterator
Iterator<T> it
:hasNext(), next(), remove()
제공// List, set의 경우 Iterator 사용 Iterator<String> it = lst.iterator(); while(it.hasNext()) { String item = it.next(); System.out.println(item); }
Set::iterator()
List::iterator()
링크(Link)로 연결된 노드(Node)의 집합
java.util.LinkedList
배열을 다루는 것과 유사한 방식으로 동적 자료구조를 사용
java.util.ArrayList
Vector vs List
항목 삽입, 삭제 동작이 동기화(synchronization) 여부의 차이
- Vector : 동기화된 삽입 삭제 동작 제공 (Thread Safe)
- List : 삽입과 삭제가 동기화 되어 있지 않음 – 외부적 동기화 필요
한쪽 끝점에서만 새로운 항목을 삽입, 삭제 할 수 있는 데이터집합
java.util.Stack
push() : 스택에 객체를 넣음
pop() : 스택에서 객체를 추출(top은 삭제)
peek() : pop과 같지만, top 값을 삭제하지 않는다 (조회만)
empty() : 스택이 비었는지 확인
pop
을 실행하면 발생한 방향으로만 새로운 항목을 삽입하고, 다른 한 방향으로만 삭제할 수 있는 데이터 집합
java.util.Queue
offer() : 데이터 입력 (enqueue)
poll() : 데이터 삭제 (dequeue)
peek() : 맨 앞 데이터 조회
List vs Set
List
- 순서가 있다
- 중복 허용 ⭕
Set (집합)
- 순서가 없다 (Index 접근 불가)
- 중복 허용 ❌
자료구조에 포함된 자료의 순서나 키에 상관없이 자료 전체를 하나의 셋으로 관리
java.util.HashSet
add(Object obj) : 데이터 입력
remove(Object obj) : 데이터 삭제
size() : 데이터의 개수 확인
contains(Object obj) : 포함여부 확인
Hash 알고리즘과 hashCode()
- 객체 해시 코드란 객체를 식별할 하나의 정수값
- Object의 hashCode()의 메서드는 객체의 메모리 번지를 이용하여 해시 코드를 만들어 리턴
➡ 모든 객체는 다른 값을 가짐- Hash 관련 컬렉션들은 다음과 같은 방식으로 두 객체가 동등한지 아닌지를 비교
- Custom 객체에 대한 동등 객체 판단 방법
// hashCode 비교 ➡ equals 확인 ➡ 동등 @Override public int hashCode() { // 객체 식별값 (정수) return id; } @Override public boolean equals(Object obj) { if (obj instanceof Student) { // 다운캐스팅 Student other = (Student) obj; return name.equals(other.name) && id == other.id; // hashCode와 field 모두 동일 시 동등 객체 } return super.equals(obj); }
Map 인터페이스를 구현하여 키와 값의 쌍을 저장하는 데이터 집합
java.util.HashTable
put(Object obj) : 데이터 입력
get(Object key) : 데이터 조회
isEmpty() : 비어있는지 확인
keySet() : Key 목록 반환 (HashSet 형태)
containsKey(Object obj) : 해당 키 포함여부 확인
containsValue(Object obj) : 해당 값 포함여부 확인
Hashtable vs HashMap
- Thread-safe 여부
null
값 허용 여부Enumeration
여부
구분 Hashtable HashMap Thread-safe ⭕ ❌ null
Key❌ ⭕ Enumeration ⭕ ❌ Hashtable은
not fail-fast Enumeration
을 제공
HashMap은 보조해시를 사용 ➡ Hashtable에 비해 해시 충돌(hash collision) 이 덜 발생