티스토리 뷰
Java 플랫폼에는 컬렉션 프레임워크가 포함되어있습니다.
컬렉션 프레임워크는 컬렉션을 표현하고 조작하기 위한 통합 아키텍처입니다.
그리고 모든 컬렉션 클래스와 인터페이스가 JDK 1.2에 정의되어있습니다.
Collection Interface 그리고 Map Interface는 java Collection framework의
기본이 되는 interface입니다.
Collection Framework 이점
1. 일관된 API를 가집니다. Collection interface를 상속받는 클래스들은 통일된 기능을 사용하여 효율성을 증대시킵니다.
구현체(Vector, ArrayList)들이 Collection, Set, List, Map과 같은 공통 인터페이스를 사용합니다.
2. 프로그램 속도 및 성능 향상, 유용한 자료구조와 고성능 구현을 제공하여 개발자는 비즈니스에 더욱 집중할 수 있습니다.
나열된 장점처럼 성능적으로 사용성으로 이미 잘 구현이 된 Collection Framework를 사용할 일만 남았습니다.
문서를 보고 JDK1.2부터 도입이 되었다고 알게 되었으며 그 시절 개발자의 상황은 모르나
생산성을 중요시하는 블루칼라 언어인 Java를 JDK1.2부터는
더욱더 Java의 탄생의 의미에 맞게 사용할 수 있지 않았을까 조심히 생각해봅니다.
Collection Framework 상속 구조
Collection Framework의 모든 기능들은 java.util package에 들어있습니다.
Collection Framework의 제일 위에는 Iterable Interface가 자리를 잡으며 Collection Interface에 의해 확장됩니다.
Collection Framework 학습 전 알면은 좋은 점
class
객체의 청사진입니다. 객체들이 어떤 것을 하고 어떤 것을 가지고 있는지 정의되어있습니다.
interface
class와 마찬가지고 메서드와 변수를 가질 수 있습니다. 대신 기본적으로 기능은 추상적이며
interface의 주요 골자는 "어떻게 해야 하는지가 아니라 무엇을 하는가"입니다.
Collection interface는 무엇을 하는가?
Collection interface를 상속받는 Class들은 하위에 나열된 행위들을 포함해야만 합니다.
add(Object o) : 컬렉션에 객체를 추가
addAll(Collection c) : 지정된 컬렉션의 모든 요소를 해당 컬렉션에 추가
clear() : 컬렉션의 모든 요소를 제거
contain() : 컬렉션에 지정된 요소가 포함되는지 확인
containAll() : 컬렉션에 지정된 컬렉션의 모든 요소가 포함되는지 확인
eqauls() : 지정된 객체와 컬렉션이 같은지 비교
hashcode() : 컬렉션의 hashcode 반환
isEmpty() : 컬렉션에 요소가 포함되어있는지 확인
iterator() : 컬렉션의 요소에 대한 반복자(iterator)를 반환
max() : 컬렉션의 최댓값을 반환
parallelStream() : 컬렉션을 소스로 하는 병렬 stream을 반환
remove(Object o) : 컬렉션에 지정된 객체를 제거, 중복 값이 있는 경우 첫 번째 항목을 제거
removeAll(Collection c) : 컬렉션에 언급된 모든 객체를 제거
removeIf(Predicate filter) : 주어진 조건을 만족하는 컬렉션의 모든 요소를 제거
retainAll(Collection c) : 주어진 컬렉션과의 교집합을 제외한 나머지 모두 제거
size() : 컬렉션의 요소의 수 반환 (배열의 크기 아님)
spliterator() : stream에서 사용되는 spliterator를 반환
stream() : 컬렉션을 소스로 사용하는 순차 스트림을 반환
toArray() : 해당 컬렉션의 요소를 모두 포함하는 배열을 반환
Collection Interface를 확장하는 Interface
0. Collection 구현체 네이밍 특징
구현 스타일 + 인터페이스 명형식의 이름을 가지는 것이 특징입니다.
Collection Framework에는 수많은 구현체가 있으므로
이름을 기준으로 특징을 기억하는 것도 방법입니다.
Hash Table
구현체에 Hash라는 이름이 붙으며
해싱을 사용하여 데이터를 저장하는 특징
이진탐색트리, 배열보다 굉장히 빠른 속도로 탐색, 삽입, 삭제를 할 수 있습니다.
Resizable Array
구현체에 Array라는 이름이 붙으며
말그대로 고정되지 않는 크기의 배열을 뜻합니다.
Balanced Tree
구현체에 Tree라는 이름이 붙으며
이진트리를 확장해 하나의 노드가 가질 수 있는 자식노드의 숫자가 최대 숫자가 2보다 큰 트리 구조
Linked List
구현체에 Linked라는 이름이 붙으며
요소(노드)간의 연결을 통해 리스트를 구현한 것입니다.
interface | Hash Table | Resizable Array | Balanced Tree | Linked List | Hash Table + Linked List |
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Deque | ArrayDeque | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap |
1. Iterable Interface
모든 Collection Framework의 루트 인터페이스입니다.
Collection Interface는 Iterable을 확장합니다.
Iterable의 주요 기능은 Iterator를 제공하는 것이며
자주 사용되는 forEach()도 default Method로 제공합니다.
2. Collection Interface
Iterable Interface를 확장합니다.
Collection Interface는 데이터를 추가, 삭제 등 기본이 되는 기능들을 모두 제공합니다.
Collection Framework에서 제공하는 클래스들의 근간이 된다고 보면 됩니다.
3. List Interface
Collection Interface의 자식이며 정렬이 되는 Collection class는 모두 상속을 합니다.
중복을 허용한다는 특징이 있습니다.
Array List
동적 배열을 제공하는 특징
요소의 수가 배열의 길이보다 커지면
배열의 copy를 통하여 자동으로 배열의 길이를 증가시키는 것 같은 사용성을 제공합니다.
타입 파라미터로 primitive type은 쓸 수 없으며 wrapper class가 필요로 합니다.
Linked List
요소들이 물리적으로 인접한 위치에 있지 않고 데이터와 주소로 이루어진 선형의 자료구조입니다.
요소들은 주소를 사용하여 서로 연결되어있습니다.
Vector
Array Listd와 같이 동적 배열을 제공합니다.
Array List와의 차이점은 멀티스레드 환경에 안전합니다.
Stack
이름처럼 후입 선출의 스택 자료구조를 구현한 구현체이며 Vector를 확장했습니다.
추가적으로 empty, peek, search의 기능을 제공합니다.
하지만 Vector의 특징을 물려받아 get() method를 호출할 때마다 Lock을 걸며 성능의 하락이 따라옵니다.
대안 구현체로 ArrayDeque를 추천합니다.
4. Queue Interface
FIFO 알고리즘의 특징을 가집니다.
Priority Queue
객체가 우선순위를 가져야 할 때 사용됩니다.
큐는 FIFO 알고리즘의 특징을 가지지만 우선순위에 따라 처리해야 하는 경우가 생깁니다.
생성자에 Comparator를 제공함으로써 우선순위의 기준을 지정할 수 있습니다.
5. Deque Interface
Queue 자료구조의 변형판이며 Queue interface를 확장합니다.
Queue는 단방향이지만 Deque는 양방향으로 요소에 접근할 수 있습니다.
Array Deque
Deque의 특징에 동적 배열의 특징이 추가되었습니다.
6.Set Interface
Set은 요소의 중복이 없으며 정렬되지 않는다는 특징이 있습니다.
Hash Set
hash table 구조의 구현체입니다.
hashcode기반으로 삽입되며 Null의 삽입을 허용합니다.
내부적으로 HashMap을 사용하기도 합니다.
Linked Hash Set
Hash Set과 유사하나 이중 연결 목록을 사용하며 요소의 순서를 유지합니다.
7.Sorted Set Interface
Set Interface와 유사합니다. 유일한 차이점은 요소의 순서를 유지하는 추가 기능이 지원됩니다.
Tree Set
데이터 저장을 위해 Tree 구조를 사용합니다.
8. Map Interface
Map Interface는 key - value 구조로 이루어집니다.
Key의 중복을 허용하지 않으며 데이터가 키를 기반으로 작업을 처리할 경우 유용합니다.
Hash Map
Map Interface의 특징을 따라가며
hashCode 값과 eqauls의 결과로 Key값을 찾기 때문에
Primitive type이 아닐 경우 hashCode(), eqauls()를 같이 재정의해야 합니다.
HashMap을 내부적으로 사용하는 Collection framework도 동일합니다.
출처
https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html
'Java & Kotlin' 카테고리의 다른 글
Java 얕은 복사, 깊은 복사 (0) | 2023.01.26 |
---|---|
Java Lambda (0) | 2022.12.16 |
Java raw type (0) | 2022.12.12 |
Java Generic (0) | 2022.12.12 |
Java NIO (0) | 2022.12.11 |
- Total
- Today
- Yesterday
- 관계설정
- ㅃ
- 프로그래머
- boot
- 코딩테스트
- 문제
- 자사서비스
- 백준 제로 자바
- jre
- springboot
- 스타트업
- 스택
- 백엔드
- boot 일대다
- JDK
- 자바
- mappedby
- Spring
- 다대일
- jdk11
- 알고리즘
- 백준
- 개발자채용
- java8
- JDK8
- jvm
- JPA
- 백준 제로
- jre8
- jre11
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |