프로그래밍을 하다보면 다수의 객체를 저장해 두고 필요할 때마다 꺼내서 사용하는 경우가 많다.
만약 10개의 product 객체를 저장해두고, 필요할때 마다 하나씩 꺼내서 이용한다고 가정하면 어떻게 객체를 효율적으로 추가, 검색, 삭제 할지 고민하게 되는데 가장 간단한 방법은 배열을 이용하는것이다. 배열은 쉽게 생성하고 사용할수 있지만, 저장할 수 있는 객체 수가 배열을 생성할 때 결정되기 때문에 객체의 수가 불확실 할때에는 문제가 있다. 또 배열은 객체를 삭제하였을 경우 해당 인덱스가 비게되어 낱알이 듬성 듬성 빠진 옥수수가 될수 있다. 그렇기 때문에 새로운 객체를 저장하려면 어디가 비어 있는지 확인하는 코드도 필요하다.
자바는 이러한 문제점을 자료구조를 바탕으로 해결하여 객체를 효율적으로 추가, 검색, 삭제 할수 있도록
java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 두었는데 이들을 총칭해서 컬렉션 프레임 워크라고 부른다.
1. 자료구조의 분류
자료구조 분류법은 많은 분류법이 있지만, 대표적으로 많이 분류되는 방법은
선형 자료구조(Linear Data Structure)과 비선형 자료구조(Nonlinear Data Structure)로 나눌 수 있습니다.
이러한 분류를 보통 '형태에 따른 자료구조'라고 보고, 각 자료구조에 알맞게 구체화 된 것들을 '구현된 자료구조'라고 합니다.
먼저 선형 자료구조(Linear Data Structure)에 대해 알아보면,
선형 자료구조는 쉽게 생각해서 데이터가 일렬로 연결된 형태라고 보면 됩니다.우리가 흔히 쓰는 int[] 배열같은 것이라 생각하면 됩니다.
선형 자료구조는 대표적으로 리스트(List)와 큐(Queue), 덱(Deque)이 있습니다.
비선형 자료구조(Nonlinear Data Structure)는 선형 자료구조의 반대입니다. 일렬로 나열된 것이 아닌, 각 요소가 여러 개의 요소와 연결 된 형태를 생각하면 됩니다. 쉽게 생각해서 거미줄 같다고 보면됩니다. 대표적인 비선형 자료구조는 그래프(Graph)와 트리(Tree)가 있습니다.
그리고 앞으로 설명 할 자료구조 중 위 두 가지 분류에 해당되지 않는 자료구조가 있는데 집합(Set), 맵(Map)입니다.
2. Collection 이란?
일정한 성질을 갖는 것을 모아 한 공간에 모아두는 것을 컬렉션이라 합니다. (ex, 동전 컬렉션 등등) 사전적 의미로는 요소를 수집하여 저장하는것을 뜻합니다.
즉, 데이터의 집합이나 그룹이라 말할 수 있습니다.
2.1 컬렉션의 특징
- 필요에 따라 확장가능
- 객체만 포함함(프리미티브 타입 불가)
- 스레드에 안전하게 만들 수 있음
- 수정 불가능하게 만들 수 잇음
2.2 컬렉션의 중복되는 의미들
1.collection(소문자 c): 객체가 저장되고 반복되는 자료 구조를 나타냅니다.
2.Collection(대문자 C): Set, List, Queue가 상속받는 java.util.Collection 인터페이스입니다. ( 이는 상속입니다. 구현이 아니라. 즉, Collection를 직접 구현한 것은 없습니다. )
3.Collections(대문자 C, s로 끝남): collections에 사용할 정적 유틸리티 메소드의 모음이 있는 java.util.Collections 클래스입니다.
java.util 패키지의 Collections Framework는 위의 interface와 유틸리티가 함께 로드됩니다.
2.3 JCF(Java Collections Framework)란?
Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며
Java Collection Framework는 Java 프로그래밍 언어에서 데이터 구조를 관리하는 데 사용되는 클래스들의 집합입니다.
이 프레임워크는 개발자들이 데이터를 쉽게 저장, 관리 및 처리할 수 있도록 다양한 인터페이스와 클래스를 제공합니다.
이러한 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현됩니다.
Java Collection Framework는 크게 3가지 부분으로 구성됩니다.
- Interfaces (인터페이스)
- Implementations (구현체)
- Algorithms (알고리즘)
인터페이스는 Collection, List, Set, Map 등과 같은 다양한 데이터 구조를 정의합니다.
구현체는 이러한 인터페이스를 구현하는 클래스들입니다.
마지막으로 알고리즘은 컬렉션 요소를 조작하거나 처리하는 데 사용되는 메서드들을 정의합니다.
Java Collection Framework는 내부적으로 데이터를 저장하기 위해 배열 또는 링크드 리스트를 사용합니다. 컬렉션의 크기가 작은 경우에는 배열을 사용하고, 크기가 큰 경우에는 링크드 리스트를 사용합니다. 이러한 내부적인 데이터 구조는 사용자에게는 보이지 않지만, 성능 측면에서 중요한 역할을 합니다.
Java Collection Framework는 스레드 안전성을 보장하기 위해 동기화 메커니즘을 제공합니다. 이는 멀티스레드 환경에서 안전하게 데이터를 처리할 수 있도록 도와줍니다.
마지막으로, Java Collection Framework는 자바 버전 5부터 제네릭스를 지원하며, 이를 통해 컴파일 시간에 타입 안전성을 보장합니다. 이는 프로그래머의 실수를 방지하고, 코드의 가독성을 향상시키는 데 큰 도움을 줍니다.
3. Collection을 사용하는 이유
1. 일괄된 API : Collection의 일관된 API를 사용하여 Collection 밑에 있는 모든 클래스(ArrayList, Vector, LinkedList 등) Collection에서 상속받아 통일된 메서드를 사용하게 됩니다
2. 프로그래밍 노력 감소 : 객체 지향 프로그래밍의 추상화의 기본 개념이 성공적으로 구현되어있습니다
3. 프로그램 속도 및 품질 향상 : 유용한 데이터 구조 및 알고리즘은 성능을 향상시킬 수 있습니다 Collection을 사용하여 최상의 구현을 생각할 필요없이 간단하게 Collection API를 사용하여 구현을 하면 됩니다
4. 컬렉션 프레임워크 주요 Interfaces (인터페이스)
Interface 는 이미 재정의 하여 꺼내쓰기만 하면 되는것을 뜻한다. (import java.utile(*) 패키지 안에 들어있다)
Collection 인터페이스는 List, Set, Queue로 크게 3가지 상위 인터페이스로 분류할 수 있다.
그리고 여기에 Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.
5. 컬렉션 클래스(collection class)
Collection인터페이스와 달리 Java 1.2이상부터 Collections라는 static클래스가 존재합니다.컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스(collection class)라고 합니다.
컬렉션 프레임워크의 모든 컬렉션 클래스는 List와 Set, Map 인터페이스 중 하나의 인터페이스를 구현하고 있습니다.
또한, 클래스 이름에도 구현한 인터페이스의 이름이 포함되므로 바로 구분할 수 있습니다.
- Collection 과 Collections는 다릅니다.
- Collections는 클래스 입니다. 이 클래스 안에 있는 메서드는 static이기 때문에 인스턴스를 생성하지 않고 바로 사용할 수 있습니다.
- 컬렉션 타입의 객체에 대한 객체생성, 정렬, 병합, 검색 등의 알고리즘을 구현 하였습니다.
5.2 Collections 클래스의 메소드
메소드 | 설명 |
Collections.sort(List L) | 리스트를 정렬합니다. |
Collections.sort(List L , reverseOrder()) |
리스트를 역순으로 정렬합니다. |
max(List L) , min(List L) | 리스트에서 최대 최솟값 |
shuffle(List L) | 리스트를 랜덤으로 섞음 |
binarySearch(List L , Key) | 오름차순으로 정렬된 리스트에서 이진검색을 통해 위치를 반환, 실패시 -1반환 |
disjoint(List L1 , List L2) | 두 리스트의 값이 완전히 다른지 검사 , 하나라도 같은값이 있으면 False |
copy(List < super T> dest, List < extends T> src) | 있는 리스트로부터 다른 리스트에 모든 요소를 카피합니다. |
reverse(List < > list) |
지정된 리스트의 요소의 순서를 반대로 합니다. |
synchronizedXXX() | 동기화 |
unmodifiableXXX() | 변경 불가 |
singletonXXX() | 싱글톤 |
checkedXXX() | 한 가지 타입의 자료만 저장 가능 |
6. Collection 인터페이스
List와 Set 인터페이스의 많은 공통된 부분을 Collection 인터페이스에서 정의하고, 두 인터페이스는 그것을 상속받습니다.
따라서 Collection 인터페이스는 컬렉션을 다루는데 가장 기본적인 동작들을 정의하고, 그것을 메소드로 제공하고 있습니다.
Collection 인터페이스에서 제공하는 주요 메소드는 다음과 같습니다.
메소드 | 설명 |
boolean add(E e) | 해당 컬렉션(collection)에 전달된 요소를 추가함. (선택적 기능) |
void clear() | 해당 컬렉션의 모든 요소를 제거함. (선택적 기능) |
boolean contains(Object o) | 해당 컬렉션이 전달된 객체를 포함하고 있는지를 확인함. |
boolean equals(Object o) | 해당 컬렉션과 전달된 객체가 같은지를 확인함. |
boolean isEmpty() | 해당 컬렉션이 비어있는지를 확인함. |
Iterator<E> iterator() | 해당 컬렉션의 반복자(iterator)를 반환함. |
boolean remove(Object o) | 해당 컬렉션에서 전달된 객체를 제거함. (선택적 기능) |
int size() | 해당 컬렉션의 요소의 총 개수를 반환함. |
Object[] toArray() | 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환함. |
6.1 Collection 하위 인터페이스의 특징
인터페이스 | 구현클래스 | 특징 |
Set<E> | HashSet TreeSet |
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다. |
List<E> | LinkedList Vector ArrayList |
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. |
Queue | LinkedList PriorityQueue |
List와 유사 |
Map<K, V> | Hashtable HashMap TreeMap Properties |
키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로, 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다. |
1. Set 인터페이스
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
부모 : Collection<E>
구현 : AbstractSet, EnumSet, HashSet, LinkedHashSet, TreeSet
종류 : Interface
특징 : 자료의 순서가 없다, 자료의 중복을 허용하지 않는다, NULL 요소 최대 1개 허용
- HashSet
- 가장빠른 임의 접근 속도
- 순서를 예측할 수 없음 - TreeSet
- 정렬방법을 지정할 수 있음
2. List 인터페이스
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
부모 : Collection<E>
구현 : AbstractList, ArrayList, LinkedList, Stack, Vector
종류 : Interface
특징 : 자료의 순서가 있다(index), 자료의 중복을 허용, 중복의 NULL 요소를 허용
- LinkedList
- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
(인접해 있는 객체들만 연결하기때문에 중간에 삽입, 삭제시 속도가 빠르다.)
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임 - Vector
- 과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음 - ArrayList
- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남, 비동기화 - Stack- 모델 및 스택 데이터 구조를 구현할 때 주로 사용, 후입선출이 기본 원칙
3. Map 인터페이스
키(Key), 값(Value)의 쌍으로 이루어진 데이터으 집합으로,
순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.
key를 이용하여 value를 찾는다
부모 :
구현 : Attributes, HashMap, LinkedHashMap, Properties, TreeMap
종류 : Interface
특징 : Key값은 중복될수 없다(Value는 중복가능), NULL 요소 최대 1개 허용
- Hashtable
- HashMap보다는 느리지만 동기화 지원
- null불가 - HashMap
- 중복과 순서가 허용되지 않으며 null값이 올 수 있다. - TreeMap
- 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름
자료구조별 대략적인 특징
Class | Base Class | Base Interface | 중복 | 순서 | 정렬 | Thread-safe |
ArrayList | AbstractList | List | Yes | Yes | No | No |
LinkedList | AbstractSequentialList | List;Deque | Yes | Yes | No | No |
Vector | AbstractList | List | Yes | Yes | No | Yes |
HashSet | AbstractSet | Set | No | No | No | No |
LinkedHashSet | HashSet | Set | No | Yes | No | No |
TreeSet | AbstractSet | Set;NavigableSet;SortedSet | No | Yes | Yes | No |
HashMap | AbstractMap | Map | No | No | No | No |
LinkedHashMap | HashMap | Map | No | Yes | No | No |
Hashtable | Dictionary | Map | No | No | No | Yes |
TreeMap | AbstractMap | Map;NavigableMap;SortedMap | No | Yes | Yes | No |
연관된 글 :
참고 :
chat gpt
https://m.blog.naver.com/jysaa5/221751546059
[Java] Collections 클래스 - velog
java.util.Collections 주요 메소드 [1/1]
https://yeon-kr.tistory.com/113
https://livenow14.tistory.com/31
https://crazykim2.tistory.com/557
'알고리즘 , 문제해결 > 자료구조' 카테고리의 다른 글
[자료구조] 스택(Stack)/큐(Queue)/덱(Deque) (0) | 2023.04.24 |
---|---|
[자료구조] 자료구조 (0) | 2023.03.17 |