Java

[Java] 14. Collections Framework

Joo.v7 2024. 9. 2. 21:46

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): 객체 간 연결된 형태로 요소를 저장.

 

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를 비교하고 반환 값을 기준으로 정렬함.

 

IterableIterator

  • 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