본문 바로가기
JAVA

[JAVA] 컬렉션 프레임워크 (Collection Framework)

by 초이사 2024. 11. 22.

컬렉션 프레임워크 (Collection Fremework)

- 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들의 모음집

-> 자료구조 종류의 형태들을 자바 클래스로 구현한 모음집

  • 자바에서는 저 모음집을 java.util 패키지에 포함시켜 놓았다.
  • 주요 인터페이스로는 List, Set, Map이 있다.

컬렉션 프레임워크의 주요 인터페이스

  • List와 Set은 객체를 추가,삭제하는 방법에 있어 공통점이 있어 공통된 메소드만 따로 모아서 Collection 인터페이스로 정의
  • Map은 키와 값을 하나의 쌍으로 묶어서 관리하는 구조

Collection Interface

인터페이스 분류 특징 구현 클래스
List - 순서를 유지하고 저장
- 중복 저장 가능
ArrayList, Vector, LinkedList
Set - 순서를 유지하지 않고 저장
- 중복 저장 안됨
HashSet, TreeSet

 

Map Interface

인터페이스 분류 특징  
Map - 키와 값으로 구성된 엔트리 저장
- 키는 중복 저장 안됨
HashMap, Hashtable, TreeMap, Properties

 

 

 

List 컬렉션

- 객체를 인덱스로 관리

       - 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공

- ArrayList, Vector, LinkedList 등이 있다.

 

List 인터페이스 메소드

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체를 추가
set(int index, E element) 주어진 인덱스의 객테를 새로운 객체로 바꿈
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
E get(int index) 주어진 인덱스에 저장된 객체를 리턴
isEmpty() 컬렉션이 비어 있는지 조사
int size() 저장되어 있는 전체 객체를 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
E remove(int index) 주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

 

ArrayList

- 배열을 이용하여 만든 리스트

- 데이터 저장 순서 유지 및 중복 허용

- 일반 배열과 달리 공간이 가변적 (자동으로 늘고 줄음)

- 단방향 포인터로 자료에 대해 순차적인 접근 가능 (조회 빠름)

- 순차적인 추가/삭제에 대해 가장 빠름. 그게 아니라면 삽입/삭제가 느리다

      - 중간에 삽입/삭제가 일어나면 인덱스가 1씩 밀리거나 당겨지게 됨

List<String> arrayList = new ArrayList<>();

 

 

LinkedList

- ArrayList와 사용 방법은 동일

- 내부 배열이 아니라 인접 객체를 체인처럼 연결해서 관리

- 양방향 포인터 구조이며 중간 삽입/삭제 시 체인을 바로 앞뒤 link만 변경하면 되기 때문에 빠르다.

- 임의의 요소에 대한 접근 성능은 좋지 않다.

- 리스트 용도 이외에도 스택, 큐, 트리 등의 자료구조 사용 시에도 사용된다.

List<String> linkedList = new LinkedList<>();

 

 

Vector

- ArrayList와 동일한 내부 구조

- ArrayList와 달리 동기화된 메소드로 구성되어 있어 Thread-Safe하다. 즉, 멀티 스레드가 동시에 Vector() 메소드를 실행할 수는 없어(= 한 번의 하나의 스레드만 실행) 멀티 스레드 환경에서 안전하게 객체를 추가 또는 삭제할 수 있다.

- 구버전 자바와 호환성을 위해 남겨두었지만 현재는 잘 쓰이지 않는다.

List<Integer> vector = new Vector<>();

 

 

 

Set 컬렉션

- 저장 순서가 유지되지 않고 중복 저장할 수 없다. (null도 하나만 저장 가능)

- 집합에 비유되기도 한다. (순서 상관없고 중복이 허용되지 않는다는 점에서)

- HashSet, LinkedHashSet, TreeSet 등이 있다

 

Set 인터페이스 메소드

기능 메소드 설명
객체 추가 boolean add(E e) 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴
객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
isEmpty() 컬렉션이 비어 있는지 조사
Iterator<E> iterator() 저장된 객체를 한 번씩 가져오는 반복자 리턴
int size() 저장되어 있는 전체 객체 수 리턴
객체 삭제 void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

 

HashSet

- set 컬렉션 중 가장 많이 사용

- 배열과 연결노드를 결합한 자료구조 형태

- 추가, 삭제, 검색, 접근이 모두 빠르나 순서는 예측할 수 없다

- 동일한 객체는 중복 저장하지 않는다

       - 동일한 객체의 기준은 동등 객체 (다른 객체라도 hashCode()의 리턴값이 같고, equals() 메소드가 true를 리턴한다면 동일한 객체라 판단)

- 인덱스로 객체를 검색할 수 없기 때문에 for문을 이용하거나 iterator() 메소드를 이용해야 한다

Set<E> set = new HashSet<E>(); // E에 지정된 타입의 객체만 저장
Set<E> set = new HashSet<>(); // E에 지정된 타입의 객체만 저장
Set set = new HashSet<>(); // 모든 타입의 객체 저장

 

 

 

Map 컬렉션

- 키와 값으로 구성된 엔트리 객체 저장 (키와 값은 모두 객체)

- 키는 중복 저장할 수 없지만 값은 중복 저장 가능

- 기존에 있는 키로 값 저장 시, 기존의 값은 사라지고 새로운 값으로 대체

- 저장 순서는 유지되지 않는다

- HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다

 

Map 인터페이스 메소드

기능 메소드 설명
객체 추가 V put(K key, V value) 주어진 키와 값을 추가, 저장이 되면 값을 리턴
객체 검색 boolean containsKey(Object key) 주어진 키가 있는 지 여부
boolean containsValue(Object value) 주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet() 키와 값으로 구성된 모든 Map.Entry 객체를 Set에 담아 리턴
V get(Object key) 주어진 키의 값을 리턴
boolean isEmpty() 컬렉션이 비어 있는지 여부
Set<K> keySet() 모든 키를 Set 객체에 담아 리턴
int size() 저장된 총 수를 리턴
Collection<V> values() 저장된 모든 값 Collection에 담아서 리턴
객체 삭제 void clear() 모든 Map.Entry(키와값)를 삭제
V remove(Object key) 주어진 키와 일치하는 Map.Entry 삭제, 삭제가 되면 값을 리턴
  • Map 인터페이스에서 값(Value)은 중복을 허용하기에 Collection 타입으로, 키(key)는 중복을 허용하지 않기에 Set 타입으로 반환한다.
  • Map.Entry 인터페이스는 Map 인터페이스 안에 있는 내부 인터페이스로 Map에 저장되는 key-value 쌍의 Node 내부 클래스가 이를 구현 (이 부분은 따로 정리할 예정!)

 

 

HashMap

- Hashtable을 보완한 컬렉션

- 키로 사용할 객체가 hashcode()의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우 동일 키로 판단, 중복 저장 허용x

- 순서를 보장하지 않는다

- 키와 값으로 null이 허용된다

- 추가, 삭제, 검색, 접근성이 모두 뛰어나다

- 비동기로 작동하기에 멀티 쓰레드 환경에는 어울리지 않는다

Map<String, Integer> map = new HashMap<String, Integer>();
Map<String, Integer> map = new HashMap<>();
Map map = new HashMap(); // 모든 타입의 키와 객체 허용의 의미로 선언은 가능하나, 잘 쓰이지는 않음

 

 

Hashtable

- HashMap과 동일한 내부 구조

- HashMap과 달리 Hashtable은 동기화된 메소드로 구성 -> 멀티스레드가 동시에 Hashtable의 메소드들 수행할 수 없다. 즉, 멀티 스레드 환경에서 안전하게 객체를 추가,삭제할 수 있다

Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();
Map map = new Hashtable(); // 잘 사용되지 않음

 

 

Properties

- Hashtable의 자식 클래스

- 키와 값을 String 클래스로 제한하여 저장하는 단순화된 컬렉션

- 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용

 

 

 

 

 

 

TreeSet과 TreeMap, LIFO와 FIFO 컬렉션을 따로 정리할 예정이다!

 

참고

 

댓글