Chapter 1: Collection Framework
- Collection 개요
- Java Collections Framework
- Collection 클래스의 저장 구조
- Java Collections Framework 구성
- Collection 인터페이스
- Collection 인터페이스의 주요 메소드
Chapter 2: Iterator, Comparable, Comparator
- Iterable과 Iterator
- Comparable
- Comparator
Chapter 3: List
- List Interface
- ArrayList
- LinkedList
- Stack
- Queue
Chapter 4: Map
- HashMap
- HashTable
- Properties
Chapter 5: Collections 클래스
- Collections 클래스
- Collection 동기화
- Unmodofiable Collection
- Singleton Collection
- Checked Collection
Chapter 1: Collection Framework
Collection 개요
- Collection: 요소로 구성된 개체. (요소 - Prinitive data type or Reference type)
- 배열: 요소를 메모리상에 연속적으로 저장 vs Collection: 요소의 저장 방식을 추상화
Java Collections Framework
- java.util 패키지에 포함된 관련 Interface와 Class의 모음.
- 모든 Collections Framework의 Class들은 공통적인 메소드를 가지고 있다.
Collection 클래스의 저장 구조
- Collection Class의 instance는 일반적으로 Collection의 요소(element) 수에 비례하여 메모리 사용.
- 연속 컬렉션 클래스(Contiguous-Collection class): 컬렉션의 각 요소에 대한 참조를 배열에 저장.
ex) ArrayList - 연결된 자료구조 (Linked-Entry): 객체 간 연결된 형태로 요소를 저장.
- 연속 컬렉션 클래스(Contiguous-Collection class): 컬렉션의 각 요소에 대한 참조를 배열에 저장.
Java Collections Framework 구성
- Java Collections Framework는 다양한 Interface와 Class(자료구조/알고리즘)로 구성.
- Abstract Class: AbstractCollection, AbstractList, AbstractSet 등의 추상 클래스 제공.
- Type Parameter: 대부분의 Class들이 타입 파라미터를 사용하는 Generics Type으로 선언됨.
ex) ArrayList Class의 계층 구조
/* Java Collections Framework에 포함된 ArrayList 클래스의 클래스 정의 */
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{ ... }
/* ArrayList 클래스의 instance는 아래와 같이 생성할 수 있다. */
AbstractList<String> list = new ArrayList<>();
Collection<String> list = new ArrayList<>();
List<String> list = new ArrayList<>();
//등등등
Collection 인터페이스
- Java Collections Framework는 기본적으로 계층 구조로 구성.
- Interface와 Abstract Class로 계층 구조를 구성.
- 최 하위 수준에 Interface와 Abstract Class를 구현한 Class(Concrete Class)가 존재.
- Collection Interface와 Map Interface가 최 상위 계층 구조에 존재.
- Collection Interface는 Iterable interface를 확장하여 요소의 순회 방법을 정의함.
- Collection Interface는 Java에서 Collection이 구현해야 할 공통적인 메소드를 가지고 있다.
Collection 인터페이스의 주요 메소드
- Collection Interface는 List, Set등 Java의 Collection 구현체들이 공통적으로 가지는 메소드를 정의.
- Collection Interface는 Iterable Interface의 Sub Type이다.
- Iterable Interface를 Iterator() 메소드를 통해 반복을 위한 공통된 동작을 가진 Iterator Interface를 반환.
- Collection 구현체(List, Set...)들은 아래의 메소드들을 동일한 방식으로 사용할 수 있다.
boolean add(E e) boolean addAll(Collection<? extends E> c) |
지정된 객체 e 또는 Collection(c) 객체들을 collection에 추가합니다. 작업을 성공하면 true를 반환합니다. |
void clear() | Collection의 모든 객체를 삭제합니다. |
boolean contains(Object o) boolean containsAll(Collection<?> c) |
Collection에 o 또는 Collection(c) 객체들이 포함되었는지 체크합니다. 존재하면 true, 존재하지 않으면 false를 반환합니다. |
boolean equals(Object o) | 동일한 객체(Collection)인지 비교합니다. 같으면 true를 반환합니다. |
int hashCode() | Collection의 hash 코드를 반환합니다. |
boolean isEmpty() | Collection이 비어있는지 확인합니다. 비어있다면 true를 반환합니다. |
Iterator iterator() | Collection 객체에서 Iterator를 반환합니다. |
boolean remove(Object o) boolean removeAll(Collection<?> c) |
객체를 삭제하거나 지정된 Collection에 포함된 객체를 삭제합니다. 삭제되면 true를 반환합니다. |
boolean retainAll(Collection<?> c) | remove의 반대, 지정된 Collection에 포함된 객체가 있다면 해당 객체를 제외한 나머지 객체를 삭제합니다. 삭제 후 Collection에 변화가 있으면 true를 반환합니다. |
int size() | Collection에 저장된 객체의 크기를 반환합니다. |
Object[] toArray() | Collection에 저장된 객체를 Object[] 형태의 배열로 반환합니다. |
T[] toArray(T[] a) | 지정된 배열에 T[] a 형태의 Collection의 객체를 저장하여 반환합니다. |
default boolean removeIf(Predicate<? super E> filter) | Collection에서 Predicate<? super E> filter 조건에 해당하는 객체를 삭제합니다. java 1.8에 추가되었습니다. |
Chapter 2: Iterator, Comparable, Comparator
Iterator: 데이터가 집합된 자료구조에서 데이터를 추출하는데 이용됨.
Comparable: 같은 Type의 Interface를 비교하고 반환 값을 기준으로 정렬함.
Iterable과 Iterator
- Iterable Interface는 for-each 반복의 대상이 될 수 있는 타입의 추상적 동작을 정의.
- Iterator() 메소드를 통해 Iterator 타입 객체를 반환.
- forEach(), spliterator() 메소드 제공
- Iterator Interface는 Collection에 저장되어 있는 요소들을 읽는 방법을 표준화함.
- 반복적인 데이터가 집합되어 있는 자료구조에서 데이터를 표준적인 방법으로 추출.
- boolean hasNext() : 더 읽을 요소가 남아있는지 확인.
- E next() : 읽어 올 요소가 남아있는지 확인하고, 있으면 해당 객체를 반환함.
- 반복적인 데이터가 집합되어 있는 자료구조에서 데이터를 표준적인 방법으로 추출.
/* Iterable을 implements한 Lecture Class가 for-each 반복의 대상이 될 수 있도록 정의 */
import java.util.Iterator;
public class Lecture<E> implements Iterable<E> {
E[] elements;
int index;
public Lecture(int size) {
this.elements = (E[])new Object[size];
this.index = 0;
}
public void add(E e) {
if (this.index >= elements.length) {
System.out.println("Class is full!");
return;
}
else {
this.elements[this.index++] = e;
}
}
public Iterator<E> iterator() {
return new LectureIterator<E>(this);
}
}
/* Iterator의 Sub Type으로, 반복하는 방법을 정의함 */
import java.util.Iterator;
public class LectureIterator<E> implements Iterator<E> {
Lecture<E> lecture;
int index = 0;
public LectureIterator(Lecture<E> lecture) {
this.lecture = lecture;
}
public boolean hasNext() {
if (this.index >= lecture.elements.length) {
return false;
}
else {
return true;
}
}
public E next() {
return lecture.elements[this.index++];
}
}
* Iterator는 표준적인 읽는 방법을 가지고 있으므로, 공통적인 문법을 사용하여 데이터를 읽을 수 있다.
/* List 읽기 */
List list = new ArrayList<>();
for (int i = 65; i < 70; i++) {
list.add(String.valueOf((char)i));
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
System.out.println(str);
}
/* HashSet 읽기 */
Set list = new HashSet<>();
for (int i = 65; i < 70; i++) {
list.add(String.valueOf((char)i));
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
System.out.println(str);
}
Comparable
- 값을 비교하는데 사용되는 compareTo() 메소드 정의
- 같은 Type의 Instance를 비교해야 하는 클래스는 모두 Comparable Interface를 구현.
- compareTo(T o) : 이 개체를 지정한 개체(this)와 argument의 개체를 비교하여 순서를 지정한다.
- Boolean을 제외한 모든 Wrapper 클래스는 모두 정렬이 가능.
- Collections Framework에서 Collection에 저장되어 있는 요소들을 읽는 방법을 표준화.
/* compareTo(T o) : this가 크면 양수, 작으면 음수, 같으면 0 */
public static <T extends Comparable<T>> void bubbleSort(T[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (array[j].compareTo(array[j+1]) > 0) {
T temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
Comparator
- Comparable Interface를 구현한 클래스의 기본 정렬 기준과 다르게 정렬할 때 사용한다.
- 기본적인 정렬 기준(오름차순)과 다르게 정렬하고 싶을 때 사용한다.
/* User의 Age를 기준으로 나이가 많으면 1을 반환, 따라서 오름차순 정렬함 */
class DescendingOrder implements Comparator<User> {
public int compare(User o1, User o2) {
if(o1.getUserAge() > o2.getUserAge()){
return -1;
} else if(o1.getUserAge() < o2.getUserAge()){
return 1;
} else {
return 0;
}
}
}
Chapter 3: List
List: 요소(element)간의 순서가 있고, 크기가 가변적인 자료구조.
List Interface
- List는 중복을 허용하면서 저장 순서가 유지되는 자료구조.
- 길이가 가변적이고, 데이터 사이의 빈 공간을 허용하지 않는다.
- 배열의 index와 같은 유일 식별자가 없다.
- Collection Interface의 Sub Type.
- Vector, LinkedList, ArrayList 등이 List Interface의 Sub Type이다.
- 장점: 데이터 크기에 따른 동적 할당, 빈 공간을 허용하지 않는다, 데이터의 삽입/삭제가 용이하다.
void add(int index, E element) | 해당 index 위치에 요소를 추가합니다. |
boolean add(E e) | 해당 요소를 추가합니다. |
E get(int index) | 해당 위치의 요소를 반환합니다. |
int indexOf(Object o) | 순방향으로 0번 위치부터 object의 위치를 반환합니다. |
int lastIndexOf(Object o) | 역방향으로 마지막 위치부터 object의 위치를 반환합니다. |
ListIterator<E> listIterator() | Iterator를 확장한 ListIterator를 반환합니다. |
ListIterator<E> listIterator(int index) | 지정된 index에서 시작하는 ListIterator를 반환합니다. |
boolean remove(Object o) | object를 삭제합니다. 성공하면 true를 반환합니다. |
E remove(int index) | index 위치의 객체를 삭제 후 삭제된 객체를 반환합니다. |
E set(int index, E element) | 지정된 index 위치에 객체를 저장합니다. |
void sort(Comparator<? super E> c) | Comparator에 의해 List를 정렬합니다. |
List<E> subList(int fromIndex, int toIndex) | 지정된 범위 (fromIndex, toIndex)에 있는 객체를 반환합니다. |
static <E> List<E> of() | 수정이 불가능한 emptyList를 반환합니다. java 9에서 추가되었습니다. |
static <E> List<E> of(E e1) | e1 요소가 포함된 수정 불가능한 리스트 (ImmutableCollections)를 반환합니다. |
ArrayList
- Java에서 가장 많이 사용되는 Collection 클래스
- 배열과 동일하게 연속된 메모리 공간을 사용.
- index를 사용하여 access 가능.
- 기본 크기 10개로 할당된 후, 가변적으로 크기가 변함.
- 생성된 크기 이상이 저장되면 메모리에 추가로 할당됨.
/* ArrayList 생성 */
ArrayList list = new ArrayList(); // 기본 크기 10으로 할당.
ArrayList list = new ArrayList(20); // 기본 크기를 20으로 생성
ArrayList list = new ArrayList(20, 10); // 기본 크기가 20이면서, 10씩 증가
/* 생성 및 데이터 삽입 */
List<String> list = new ArrayList();
list.add("red");
list.add("green");
list.add("blue");
/* 처음 위치에 데이터 삽입 */
list.set(0,"white");
/* 데이터 삭제 */
list.remove("white");
/* 데이터 존재 확인 */
list.contains("green")
2024.09.02 - [자료구조] - [Java] ArrayList
[Java] ArrayList
ArrayList연속적인 데이터의 리스트 (데이터는 연속적으로 들어 있어야 하고, 중간에 빈 공간이 있어서는 안됨)내부적으로 Object[] 배열을 이용하여 요소를 저장index를 사용하여 요소에 빠르게 접근
lightningtech.tistory.com
LinkedList
- Node라고 불리는 각 요소가 데이터와 포인터를 사용하여 한 줄로 연결되는 자료구조.
- 삽입/삭제가 쉽고 동적이다.
- 배열과 달리 데이터가 연속적으로 존재하지 않음.
- 모든 요소가 데이터를 연결(Link)한 형태의 자료구조.
- 직접적으로 노드에 접근 X, Head Node에서 시작하여 링크를 따라서 접근하는 순회 방식의 접근.
public void addFirst(E e) | 첫 번째 요소로 추가합니다. |
public void addLast(E e) | 마지막 요소로 추가합니다. |
public E removeFirst() | 첫 번째 요소를 제거합니다. |
public E removeLast() | 마지막 요소를 제거합니다. |
public E getFirst() | 첫 번째 요소를 반환합니다. |
public E getLast() | 마지막 요소를 반환합니다. |
ListIterator<E> listIterator(int index) | 지정된 index에서 시작하는 ListIterator를 반환합니다. |
/* Linked List 생성 및 데이터 삽입 */
LinkedList<String> list = new LinkedList<>();
list.add("red");
list.add("green");
list.add("white");
/* 처음과 끝 위치에 데이터 삽입 */
list.addLast("pink");
list.addFirst("yellow");
/* 데이터 삭제 */
list.removeFirst();
list.removeLast();
/* 데이터 access */
for(String color : list){
System.out.println("color:" + color);
}
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
System.out.println("color:" + iterator.next());
}
2024.09.04 - [자료구조] - [자료구조] LinkedList
[자료구조] LinkedList
LinkedList Node라고 불리는 각 요소가 데이터와 포인터를 사용하여 한 줄로 연결되는 자료구조. 코드/* List.java : list ADT */public interface List extends Iterable { void add(E item); E get(int index); int size(); void remov
lightningtech.tistory.com
Stack
- FILO (First In Last Out) 구조를 가진 전통적인 자료구조.
public E push(E item) | Stack의 맨 위에 데이터를 추가합니다. |
public synchronized E pop() | Stack의 맨 위의 값을 삭제하고 반환합니다. |
public synchronized E peek() | Stack의 맨 위의 값을 반환합니다(삭제하지 않음). |
public synchronized int search(Object o) | Stack에서 해당 객체가 몇 번째 위치에 있는지 반환합니다. |
public boolean empty() | Stack이 비어있는지 확인합니다. 비어있다면 true를 반환합니다. |
/* Stack 생성 및 데이터 삽입 */
Stack<String> stack = new Stack<>();
stack.push("white");
stack.push("red");
/* 데이터 꺼냄 */
stack.pop();
/* 최 상위 데이터 조회(삭제 X) */
stack.peek();
/* 데이터 순회 */
for(String s: stack) {
System.out.print(s + " ");
}
Iterator iterator = stack.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
2024.09.02 - [자료구조] - [자료구조] 스택(Stack) with Java
[자료구조] 스택(Stack) with Java
Stack(스택) 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 및 Last in First Out(LIFO) 구조의 자료구조. Java에서 자료구조(알고리즘)를 만들 때, 해당 객체에 대한 설계도(ADT, Abstract Data Type)를 Interface
lightningtech.tistory.com
Queue
- FIFO (First In First Out) 형태를 가지는 자료구조.
- 데이터가 입력되는 순서대로 처리되어야 하는 상황에서 사용.
- LinkedList로 Queue를 구현한다.
public boolean add(E e) | element를 Queue에 추가합니다. 성공하면 true를 반환하며, 저장 공간이 부족하면 IllegalStateException이 발생합니다. |
public boolean remove(Object o) | Queue에서 Object를 제거합니다. |
public E element() | 삭제 없이 요소를 반환합니다. peek과는 달리 Queue가 비어 있으면 NoSuchElementException이 발생합니다. |
public boolean offer(E e) | Queue에 객체를 저장합니다. 성공하면 true, 실패하면 false를 반환합니다. |
public E poll() | Queue에서 객체를 꺼내서 반환합니다. Queue가 비어 있으면 null을 반환합니다. |
public E peek() | Queue에서 객체를 꺼내서 반환합니다. 비어 있으면 null을 반환합니다. |
/* Queue의 생성 및 데이터 삽입 */
Queue queue = new LinkedList();
queue.add("white");
queue.offer("green");
/* 데이터 꺼냄 */
queue.peek()
queue.poll();
/* 데이터 조회(삭제 X) */
queue.element();
/* 데이터 삭제 */
queue.remove();
/* 데이터 순회 */
for(String color : list){
System.out.println("color:" + color);
}
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println("color:" + iterator.next());
}
2024.09.07 - [자료구조] - [자료구조] Queue(큐) with Java
[자료구조] Queue(큐) with Java
Queue(큐)FIFO (First In First Out) 형태를 가지는 자료구조.데이터가 입력되는 순서대로 처리되어야 하는 상황에서 사용. 코드/* LinkedList로 구현한 Queue */import java.util.LinkedList;// Queue ADTpublic interface Queue
lightningtech.tistory.com
Chapter 4: Map
Map: Key/Value로 이루어져 하나의 쌍으로 묶인 데이터를 저장하는 Collection
Map Interface
- Key-Value 쌍으로 이루어진 데이터를 저장하는 자료구조.
- Key는 중복을 허용하지 않음.(유일한 값)
- Value는 중복을 허용.
- 입력된 순서를 유지하지 않으며, 정렬되지 않음.
- 삽입 / 삭제 / 검색에 유리.
void clear() | Map의 모든 개체를 삭제합니다. |
boolean containsKey(Object key) | 지정된 Key와 일치하는 Map의 Key가 있는지 확인합니다. |
boolean containsValue(Object value) | 지정된 value와 일치하는 value가 있는지 확인합니다. |
Set entrySet() | Map에 저장된 key-value 쌍을 Map.Entry 객체로 저장한 Set로 반환합니다. |
Object get(Object Key) | 지정한 Key에 대응하는 Value를 반환합니다. |
boolean isEmpty() | Map 객체가 비어있는지 여부를 반환합니다. |
Set keySet() | Map에 저장된 모든 Key를 반환합니다. |
Object put(Object key, Object value) | Key-Value 쌍을 Map에 저장합니다. |
void putAll(Map t) | 파라미터로 전달받은 Map의 모든 Key-Value 쌍을 저장합니다. |
int size() | Map에 저장된 key-value 쌍의 개수를 반환합니다. |
Collection values() | Map에 저장된 모든 value를 반환합니다. |
- Hash
- 데이터를 검색할 때 사용할 key와 실제 데이터의 Value가 한 쌍으로 존재.
- key값이 배열의 index(key를 해시 함수에 넣고 return한 값)로 저장되도록함.
- 검색/저장을 빠르게 하는 기법 (검색/저장의 시간 복잡도가 O(1)에 수렴)
HashMap
HashTable
Properties
Chapter 6: Collections 클래스
Collections 클래스
Collection 동기화
Unmodofiable Collection
Singleton Collection
Checked Collection
'Java' 카테고리의 다른 글
[Java] Java Logging (0) | 2024.09.11 |
---|---|
[Java] Maven (메이븐) (2) | 2024.09.11 |
[Java] 13. Anotation(어노테이션) (0) | 2024.09.02 |
[Java] 12. Lambda Expression(람다식) (2) | 2024.09.01 |
[Java] 11. Generics(제네릭) (0) | 2024.08.31 |