Collections Framework (컬렉션 프레임워크)
java.util 패키지에서 제공하는 자료구조를 사용해서 추가/삭제/검색 할 수 있도록 인터페이스와 구현 클래스 모음 입니다.
- 가장 큰 카테고리인 Collection과 Map 으로 나뉩니다.
주요 인터페이스와 구현한 클래스
- List
- ArrayList
- Vector
- LinkedList
- Set
- Queue
- PriorityQueue
- Map
- SortedMap
- HashMap
- Hashtable
- Properties
List
- List는 순서가 있는 데이터의 집합을 표현하는 인터페이스입니다.
- List의 구현 클래스로는 ArrayList와 LinkedList가 주로 사용됩니다.
- 자동으로 증가될 수 있는 형태의 컨테이너가 필요할 때 사용합니다.
- List는 배열과 같은 방이 있을 때, 다른 인덱스에 같은 값이 들어가도 무방합니다.
ArrayList
List<String> list1 = new ArrayList<String>();
- ArrayList는 내부적으로 배열을 사용하여 요소들을 관리합니다.
- 동적 배열로 크기가 자동으로 조절되며, 인덱스를 사용하여 요소에 빠르게 접근할 수 있습니다.
- 요소의 삽입과 삭제가 느리지만, 요소의 검색이 빠르고 메모리를 적게 사용합니다.
LinkedList
List<String> list2 = new LinkedList<String>();
- LinkedList는 이중 연결 리스트로 구현되어 있습니다.
- 각 요소는 자신의 이전 요소와 다음 요소에 대한 참조를 가지고 있어서 삽입과 삭제가 빠릅니다.
- 하지만 요소의 검색이 느리고 메모리를 많이 사용합니다.
Set
Set<E> set = new HashSet<E>();
- Set은 순서가 없는 데이터의 집합을 표현하는 인터페이스입니다.
- Set의 구현 클래스로는 HashSet, TreeSet 등이 있습니다.
- 관리해야되는 데이터가 중복적으로 저장되어 있지 않은 형태의 컨테이너가 필요하다면 사용합니다. (고유한 값을 저장)
- Set은 배열과 같은 방이 있을 때, 다른 인덱스에 같은 값이 들어갈 수 없습니다.
- 인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드는 없습니다.
대신, Iterator() 메소드를 호출하여 얻을 수 있습니다.
HashSet
- Set 인터페이스의 구현 클래스 입니다.
- HashSet은 해시 테이블을 사용하여 요소들을 관리합니다.
- 중복된 요소를 허용하지 않으며, 해시 함수를 사용하여 요소들을 분산시켜 저장합니다.
문자열을 HashSet에 저장할 경우에 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 다른 문자열은 갖는 String 객체는 다른 객체로 간주됩니다.
그 이유는 String 클래스가 Object의 메소드는 hashCode()와 equals() 를 재정의해서 같은 문자열일 경우 hashCode()의 리턴값은 같게, equals() 리턴값은 true가 나오도록 했기 때문입니다.
- HashSet이 판단하는 동일한 객체의 기준:
- 같은 인스턴스 X
- (1) hashCode() 메소드를 호출해서 해시코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교합니다.
만약 동일한 해시코드가 있다면 다시 (2) equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하여 중복 저장을 하지 않게 됩니다.
동등 객체의 조건
(1) hashCode()의 리턴값이 같아야 합니다.
(2) equals() 메소드가 true를 리턴해야 합니다.
(사용 예제)
Vector
- ArrayList와 마찬가지로 동적 배열을 구현한 클래스입니다.
내부적으로 배열을 사용하여 요소들을 저장하고 관리합니다.
- 차이점은 synchronized 메소드 (동기화 메소드) 로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드들을 실행할 수 없고, 하나의 스레드가 메소드를 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다는 점입니다.
- 스레드에 안전합니다. (thread safe)
- 하지만, 요소에 접근할 때 동기화 메커니즘이 추가되어 있기 때문에 일부 상황에서는 성능이 떨어질 수 있습니다.
Map
- 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조입니다.
- Enrty:
Map 인터페이스 내부에 선언된 중첩 인터페이스 입니다.
- 키는 중복 저장 X, 값은 중복 저장 O
HashMap
Map<K, V> map = new HashMap<K, V>();
- Map 인터페이스를 구현한 대표적인 Map 컬렉션 입니다.
사용 예시
- 사용자 정의 객체인 Student를 키로 하고 점수를 값으로 저장하는 HashMap 사용
- 학번과 이름이 동일한 Student를 동등 키로 간주하기 위해 Student 클래스에서 hashCode()와 equals() 메소드 재정의 합니다.
Hashtable
Map<K, V> map = new Hashtable<K, V>();
- HashMap과의 차이점: Hashtable은 synchronized 메소드 (동기화된 메소드)로 구성되어있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 점 입니다.
- Hashtable은 스레드에 안전(thread safe) 합니다.
사용 예시
- 키보드로 아이디와 비밀번호를 입력받아서, Hashtable에 저장되어 있는 키(아이디)와 값(비밀번호)을 비교한 후 로그인 여부를 출력하기