이번 포스팅은 Java 컬렉션에 대해 이해하고
알아보는 시간을 가져보겠습니다.
1) 컬렉션 프레임웍(Collection framework) 이란?
다수의 데이터를 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
컬렉션을 다루기 위한 표준화된 프로그래밍 방식이다.
java.utill 패키지에 포함되며, JDK1.2부터 제공한다. (1.2 전에도 존재하였으니 표준화가 되어있지 않았다.)
컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공합니다.
아래는 프레임웍의 상속 구조입니다.
2) 컬렉션 프레임웍의 인터페이스
다수의 데이터를 다루는 핵심 인터페이스는 List, Set , Map 3가지가 있습니다.
각각의 특성을 알아보겠습니다.
인터페이스 | 특징 |
List | 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다. |
Set | 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. |
Map | 키(key) 와 값(value) 의 쌍(pair) 으로 이루어진 데이터의 집합이다 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값을 중복을 허용한다. 구현클래스 : HashMap, TreeMap, Hashtable, Properties 등 |
3) 컬렉션(Collection) 인터페이스
List와 Set 인터페이스의 공통된 부분을 Collection 인터페이에서 정의하고, 두 인터페이스는 그것을 상속받습니다.
Collection 인터페이스는 컬렉션을 다루는데 가장 기본적인 동작을 정의하고, 그것을 메서드로 제공하고 있습니다.
따라서 List인터페이스와 Set 인터페이스의 공통된 부분을 Collection인터페이스에서 정의하고 있습니다.
아래는 Collection 인터페이스의 메서드입니다.
메소드 | 설명 |
boolean add boolean addAll |
저장된 객체 또는 Collection의 객체들을 Collection에 추가한다. |
void clear | Collection 의 모든 객체 를 제거함. |
boolean contains | Collection 이 전달된 객체를 포함하고 있는지를 확인함 |
boolean equals | Collection 과 전달된 객체가 같은지를 확인함. |
boolean isEmpty | Collection 이 비어있는지를 확인함. |
Iterator<E> iterator | Collection 의 iterator 얻어서 반환함. |
boolean remove | 지정된 객체를 삭제한다. |
int size | Collection의 저장된 객체의 개수를 반환한다. |
Object[] toArray | Collection에 저장된 객체를 객체배열로 반환한다. |
4) List인터페이스
1. Vector
Java1 버전 대에서부터 있었던 자료구조입니다. (지금은 거의 쓰지 않는 자료구조입니다)
특징은
- 필요에 따라 크기를 동적으로 조절할 수 있는 동적배열을 구현합니다.
- 배열과 마찬가지로 정수 인덱스를 이용하여 배열에 액세스 할 수 있습니다.
- 동기화되어있으며 한 번에 하나의 스레드만 백터의 메서드를 호출할 수 있습니다.
2. ArrayList
자바 표준 배열보다 약간 느릴 수 있지만 배열에서 많은 조작이 필요로 할 때 유용하게 사용됩니다.
기본 데이터 타입에 대해 만들 수 없기 때문에 Integer, Object 등의 객체에 대해 참조해서 사용합니다.
특징은
- 배열을 이용하기 때문에 인덱스를 이용해 요소에 빠르게 접근할 수 있습니다.
- 크기가 고정되어 있는 배열과 달리 데이터 적재량에 따라 가변적으로 공간을 늘리거나 줄일 수 있습니다.
- 하지만 배열공간이 꽉 찰 때마다 배열을 copy 하는 방식으로 늘리므로 이 과정에서 지연이 발생합니다.
- 데이터를 리스트 중간에 삽입/삭제할 경우, 중간에 빈 공간이 생기므로 요소들의 위치를 앞뒤로 자동으로 이동시키기 때문에 삽입/ 삭제 동작은 느립니다.
따라서 조회를 많이 하는 경우에 사용하는 것이 좋습니다.
3. LinkedList
ArrayList와 같이 인덱스로 접근하여 조회/ 삽입이 가능합니다.
하지만 내부 구조는 완전히 다르게 구성되어 있다는 점이 특징입니다.
ArrayList는 내부적으로 배열을 이용하여 메서드로 조작이 가능하게 만든 Collection이라면
LinkedList는 객체끼리 주소를 서로 가리키며 링크(참조)함으로써 이어지는 구조입니다.
아래는 List인터페이스의 메서드입니다.(Collection의 인터페이스는 제외했습니다.)
메서드 | 설명 |
void add(int index, Object element) | 지정된 위치에 객체 또는 컬렉션에 포함된 객체들을 추가한다. |
Object get(int index) | 지정된 위치(index)에 있는 객체를 반환한다. |
int indexOf(Object o) | 지정된 객체의 위치(index)를 반환한다. (List의 첫 번째 요소부터 순방향으로 찾는다) |
int lastindexOf(Object o) | 지정된 객체의 위치(index)를 반환한다. |
int lastindexOf(Object o) | 지정된 객체의 위치(index)를 반환한다. (List의 마지막 요소부터 역방향으로 찾는다.) |
Listlterator listlterator() Listlterator listlterator(int index) |
list의 객체에 접근할 수 있는 Listlterator을 반환한다. |
Object set (int index, Object element) | 지정된 위치(index)에 객체(element)를 저장한다. |
void sort(Comparator c) | 지정된 비교자(comparator)로 List를 정렬한다. |
List subList(int fromlndex, int tolndex) | 지정된 범위(fromlndex부터 tolndex)에 있는 객체를 반환한다. |
5) Set인터페이스
Set은 쉽게 말해 집합이라고 보시면 됩니다.
기본적으로 Set혹의 Set계열을 구현하는 클래스는 다음과 같은 공통점이 있습니다.
1. 중복되는 요소를 허용하지 않는다.
2. 저장 순서를 유지하지 않는다.
1. HashSet
가장 기본적인 Set컬렉션의 클래스입니다. 입력순서를 보장하지 않고 순서도 마찬가지로 보장되지 않습니다.
2. LinkedHashSet
LinkedList를 보면 add() 메서드를 통해 요소들을 넣은 순서대로 연결한다. 즉 LinkedList의 첫 번째 요소부터
차례대로 출력하면 입력했던 순서대로 출력된다는 것이고 이는 순서를 보장한다.
Set의 경우 기본적으로 입력순서를 보장하지 않기 때문에 '중복은 허용하지 않으면서 순서를 보장받고 싶은 경우' LinkedHashSet을 사용한다.
3. TreeSet
HashSet과 마찬가지로 입력 순서대로 저장 순서를 보장하지 않으며 중복 데이터 또한 넣지 못한다.
다만 특별한 점이 있다면 데이터를 정렬하여 저장하고 있다는 특징이 있다.
그러므로 ' 중복은 허용하지 않으면 정렬하고 싶을 TreeSet를 사용한다.'
Set인터페이스가 가지고 있는 메서드는 Collection인터페이스와 동일하다.
6) Map인터페이스
Map은 키(Key)와 값(value)의 쌍으로 연관 지어 이루어진 데이터의 집합입니다.
값(value)은 중복되어 저장될 수 있지만, 키(key)는 해당 Map에서 유일해야만 하니다.
기존에 저장된 키값과 동일한 값을 저장하면 기존의 값은 없어지고 마지막에 저장한 값만 남게 됩니다.
1. HashMap
배열과 연결이 결합된 형태로 키 와 값을 묶어 하나의 데이터로 저장합니다.
중복을 허용하지 않고 순서를 보장하지 않습니다.
키 와 값으로 null이 허용됩니다.
추가, 삭제, 검색, 접근성이 모두 뛰어납니다.
HashMap은 비동기로 작동하기 때문에 멀티 스레드 환경에서 어울리지 않습니다.
2. HashTable
자바 초기에 나온 클래스입니다.
HashMap과 기능은 비슷하지 만 만 동기화를 지원합니다.
HashMap과 달리 Key값과 Value값에 null이 허용되지 않습니다.
3. TreeMap
순서를 가지지 않고, 중복을 허용하지 않습니다.
TreeSet과 비슷합니다.
key값을 기준으로 데이터를 정렬하여 저장합니다.
정렬되는 순서는 숫자 -> 알파벳 대문자 -> 알파벳 소문자 -> 한글 순입니다.
4. Propertioes
주로 애플리케이션 환경 설정과 관련된 속성 파일이. propreties를 설정하는 데 사용됩니다.
아래는 Map의 메서드입니다.
메서드 | 설명 |
void clear() | Map의 모든 객체를 삭제 |
boolean containsKey(Object key) | 지정된 key객체와 일치하는 객체가 있는지 확인 |
boolean contains Value(Object value) | 지정된 value객체와 일치하는 객체가 있는지 확인 |
Set entrySet() | Map에 저장된 key-value쌍을 Map,Entry타입의 객체로 저장한 Set을 반환 |
boolean equals(Object o) | 동일한 Map인지 비교 |
Object get(Object key) | 지정한 key객체에 대응하는 value객체를 반환 |
int hashCode() | 해시코드를 반환 |
boolean isEmpty() | Map이 비어있는지 확인 |
Set keySet() | Map에 저장된 모든 key객체를 반환 |
Object get(Object key) | 지정한 key객체에 대응하는 value객체를 반환 |
int hashCode() | 해시코드를 반환 |
boolean is Empty() | Map이 비어있는지 확인 |
Set keySet() | Map에 저장된 모든 key객체를 반환 |
Object put(Object key, Object value) | Map에 key객체와 value객체를 연결하여저장 |
void putAll(Map t) | 지정된 Map의 모든 key-value쌍을추가 |
Object remove(Object key) | 지정한 key객체와 일치하는 key-value객체를 삭제 |
int size() | Map에 저장된 key-value쌍의 개수를 반환 |
Collection values() | Map에 저장된 모든 value객체를 반환 |
Map 인터페이스의 메서드를 보면 Key값을 반환할 때 Set인터페이스 타입으로 반환하고 Value값을 반환할때 Collection타입으로 반환하는걸 수 있다.
Map 인터페이스에서 값은 중 허용하기 때문에 Collection타입으로 반환하고 , 키는 중복을 허용하지 않기 때문에 Set타입으로 반환하하는 것이다.
7) 컬렉션 프레임웍 사용 시점
컬렉션 프레임웍에 자료구조에 대해 알아보았습니다. 그렇다면 이 많은 것들을 어느 상황에 사용하는 것이 좋은지
알아보기 위해서 아래에 그림을 따라 추적해서 상황에 알맞은 자료구조를 선택할 수 있습니다.
1. ArrayList
- 리스트 자료구조를 사용한다면 기본 선택
- 임의의 요소에 대한 접근성이 뛰어남
- 순차적인 추가/삭제 제일 빠름
- 요소의 추가/삭제 불리
2. LinkedList
- 요소의 추가/삭제 유리
- 임의의 요소에 대한 접근성이 좋지 않음
3. HashMap / HashSet
- 해싱을 이용해 임의의 요소에 대한 추가/삭제/검색/접근성 모두 뛰어남
- 검색에 최고성능 ( get 메서드의 성능이 O(1) )
4. TreeMap / TreeSet
- 요소 정렬이 필요할 때
- 검색(특히 범위검색)에 적합
- 그래도 검색 성능은 HashMap보다 떨어짐
5. LinkedHashMap / LinkedHashSet
- HashMap과 HashSet에 저장 순서 유지 기능을 추가
📚 Reference
🧱 Java Collections Framework 종류 💯 총정리
Java Collection Framework 자바 새내기분들은 컬렉션 프레임워크라는 단어에 뭔가 거창하고 어려운 느낌이 들수 있겠지만, 그냥 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집
inpa.tistory.com
https://walbatrossw.github.io/java/2018/02/16/java-basic-25-collection-summury.html
Java - 컬렉션 프레임워크(Collection Framework) 요약 - 더블에스 Devlog
본 내용은 자바의 정석 3rd Edition을 참고하여 작성되었습니다. 개인적으로 학습한 내용을 복습하기 목적이기 때문에 내용상 오류가 있을 수 있습니다. 1. 컬렉션 클래스간의 관계도 2. 컬렉션 클
walbatrossw.github.io
https://velog.io/@simjayeon/study-1 day
day 1 : [JAVA 자료구조] Collection과 Map
자료구조는 크게 Collection과 Map으로 나눌 수 있다. Collection에는 Set, List, Queue로 구성되어 있다.
velog.io
https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
The Collections Framework
The Collections Framework The collections framework is a unified architecture for representing and manipulating collections, enabling them to be manipulated independently of the details of their representation. It reduces programming effort while increasin
docs.oracle.com
'개발 > Java' 카테고리의 다른 글
JSoup 을이용하여 Java웹 크롤링 (0) | 2024.01.09 |
---|---|
Java - JVM,JRE,JDK란 무엇인가? (0) | 2023.03.06 |