Set : 데이터의 집합이며, 순서가 없고 중복된 데이터를 허용하지 않는다.
중복되지 않는 데이터를 구할떄 유용하며, 빠른 검색 속도를 가진다.
인덱스가 따로 존재하지 않기 때문에 Iterator를 사용한다.
Map : Key와 Value의 한쌍으로 이루어진 데이터의 집합, Key에 대한 중복이 없으면 순서를 보장하지 않는다.
뛰어난 검색 속도를 가진다.
인덱스가 따로 존재하지 않기 때문에 Iterator를 사용한다.
List 종류
- LinkedList
. 양방향 포인터 구조로 데이터 삽입, 삭제가 빠르다.
. ArrayList 보다 검색이 느리다.
- ArrayList
. 단방향 포인터 구조로 데이터 순차적 접근에 강점을 가진다.
. 배열을 기반으로 데이터를 저장한다.
. 데이터 삽입, 삭제가 느리다.
. 데이터 검색이 빠르다.
Set 종류
- HashSet
. 인스턴스의 해시값을 기준으로 저장하기 때문에 순서를 보장하지 않는다.
. NULL 값을 허용한다.
. TreeSet 보다 삽입, 삭제가 빠르다.
- LinkedHashSet
. 입력된 순서를 보장한다.
- TreeSet
. 이진 탐색 트리(Red-Black Tree)를 기반으로 한다.
. 데이터들이 오름차순으로 정렬된다.
. 데이터 삽입, 삭제에는 시간이 걸리지만 검색, 정렬이 빠르다.
Map 종류
- HashMap
. Key에 대한 중복이 없으며 순서를 보장하지 않는다.
. Key와 Value 값으로 NULL을 허용한다.
. 동기화가 보장되지 않는다.
. 검색에 가장 뛰어난 성능을 가진다.
- HashTable
. 동기화가 보장되어 프로그램이이 가능하고 HashMap 보다 처리 속도가 느리다.
. Key와 Value 값으로 NULL 허용을 하지 않는다.
- LinkedHashMap
. 입력된 순서를 보장한다.
- TreeMap
. 이진 탐색 트리(Red-Black Tree)를 기반으로 키와 값을 저장한다.
. Key 값을 기준으로 오름차순 정렬되고 빠른 검색이 가능하다.
. 저장 시 정렬을 하기 때문에 시간이 다소 오래걸린다.
컬렉션 프레임워크
컬렉션 프레임워크
- 널리 알려진 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색 할 수 있도록 관련 인터페이스와 클래스들을 포함시켜 놓은 java.util 패키지
- 조요 인터페이스 : List, Set, Map
List 컬렉션
List 컬렉션
- 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공
ArrayList
- ArrayList에 객체를 추가하면 내부 배열에 객체가 저장되고 제한 없이 객체를 추가할 수 있음
- 객체의 번지를 저장. 동일한 객체를 중복 저장 시 동일한 번지가 저장. null 저장 가능
- ArrayList 컬렉션에 객체를 추가 시 인덱스 0번부터 차례대로 저장
- 특정 인덱스의 객체를 제거하거나 삽입하면 전체가 앞/뒤로 1씩 당겨지거나 밀림
- 빈번한 객체 삭제와 삽입이 일어나는 곳에선 바람직하지 않음
Vector
- 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없음
- 멀티 스레드 환경에서는 안전하게 객체를 추가 또는 삭제할 수 있음
LinkedList
- 인접 객체를 체인처럼 연결해서 관리. 객체 삭제와 삽입이 빈번한 곳에서 ArrayList보다 유리
Set 컬렉션
Set 컬렉션
- Set 컬렉션은 저장 순서가 유지되지 않음
- 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있음(수학의 집합 개념)
HashSet
- 동등 객체를 중복 저장하지 않음
- 다른 객체라도 hashCode() 메소드의 리턴값이 같고, equals() 메소드가 true를 리턴하면
동일한 객체라고 판단하고 중복 저장하지 않음
- iterator() 메소드: 반복자를 얻어 Set 컬렉션의 객체를 하나씩 가져옴
Map 컬렉션
Map 컬렉션
- 키와 값으로 구성된 엔트리 객체를 저장
- 키는 중복 저장할 수 없지만 값은 중복 저장할 수 있음. 기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 대치
HashMap
- 키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우 동일 키로 보고 중복 저장을 허용하지 않음
Hashtable
- 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Hashtable의 메소드들을 실행 불가
- 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.
Properties
- Properties는 Hashtable의 자식 클래스. 키와 값을 String 타입으로 제한한 컬렉션
- 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용
- 프로퍼티 파일은 키와 값이 = 기호로 연결된 텍스트 파일(ISO 8859-1 문자셋, 한글은 \u+유니코드)
- Properties 객체를 생성하고, load() 메소드로 프로퍼티 파일의 내용을 메모리로 로드
검색 기능을 강화시킨 컬렉션
TreeSet
- 이진 트리를 기반으로 한 Set 컬렉션
- 여러 개의 노드가 트리 형태로 연결된 구조. 루트 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할 수 있음
- TreeSet에 객체를 저장하면 부모 노드의 객체와 비교해서 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장
TreeSet 컬렉션을 생성하는 방법
TreeSet<E> treeSet = new TreeSet<E>();
TreeSet<E> treeSet = new TreeSet<>();
- Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메소드가 TreeSet에만 정의되어 있기 때문
TreeMap
- 이진 트리를 기반으로 한 Map 컬렉션. 키와 값이 저장된 엔트리 저장
- 부모 키 값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 Entry 객체를 저장
Comparable과 Comparator
- TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체를 정렬
- Comparable 인터페이스에는 compareTo() 메소드가 정의. 사용자 정의 클래스에서 이 메소드를 재정의해서 비교 결과를 정수 값으로 리턴
- 비교 기능이 없는 Comparable 비구현 객체를 저장하려면 비교자 Comparator를 제공
- 비교자는 compare() 메소드를 재정의해서 비교 결과를 정수 값으로 리턴
LIFO와 FIFO 컬렉션
후입선출과 선입선출
- 후입선출(LIFO): 나중에 넣은 객체가 먼저 빠져나가는 구조
- 선입선출(FIFO): 먼저 넣은 객체가 먼저 빠져나가는 구조
- 컬렉션 프레임워크는 LIFO 자료구조를 제공하는 스택 클래스와 FIFO 자료구조를 제공하는 큐 인터페이스를 제공
Stack
- Stack 클래스: LIFO 자료구조를 구현한 클래스

Queue
- Queue 인터페이스: FIFO 자료구조에서 사용되는 메소드를 정의
- LinkedList: Queue 인터페이스를 구현한 대표적인 클래스
동기화된 컬렉션
동기화된 컬렉션
- 동기화된 메소드로 구성된 Vector와 Hashtable는 멀티 스레드 환경에서 안전하게 요소를 처리
- Collections의 synchronizedXXX() 메소드: ArrayList, HashSet, HashMap 등 비동기화된 메소드를 동기화된 메소드로 래핑
수정할 수 없는 컬렉션
수정할 수 없는 컬렉션
- 요소를 추가, 삭제할 수 없는 컬렉션. 컬렉션 생성 시 저장된 요소를 변경하고 싶지 않을 때 유용
- List, Set, Map 인터페이스의 정적 메소드인
of()로 생성 - List, Set, Map 인터페이스의 정적 메소드인
copyOf()을 이용해 기존 컬렉션을 복사 - 배열로부터 수정할 수 없는 List 컬렉션을 만듦
'자바' 카테고리의 다른 글
자바 - 스트림 요소 처리 (0) | 2023.01.27 |
---|---|
자바 - 람다식 (0) | 2023.01.27 |
자바 - 멀티 스레드 (0) | 2023.01.25 |
자바 - 제네릭 (0) | 2023.01.20 |
자바 - java.base 모듈 (0) | 2023.01.18 |