[Java] Collection 정리_1

Harry park·2022년 12월 4일
0

Java

목록 보기
6/8

Java Collection Framework (JCF)

Java에서 데이터를 저장하는 기본적인 자료구조들을 한 곳에 모아 관리하고 편하게 사용하기 위해서 제공하는 인터페이스를 의미한다. 다음은 JCF의 상속 구조이며 사용 용도에 따라 List, Set, Map 3가지로 요약할 수 있다.

컬랙션 개념

📖 컬렉션(Collection)은 여러 요소들을 담을 수 있는 자료구조다. 즉, 다수의 데이터 그룹이며 다른 말로 컨테이너(Container)라고도 부른다. 배열과 비슷하지만 크기가 고정된 배열을 보완하여 Re-sizable 한 특성을 가진다.

컬랙션 등장배경

📖 컬렉션 프레임워크는 아래 나열된 배열의 문제점을 해결하기 위해 등장하였다.
1. 배열은 선언과 동시에 배열의 크기가 초기화 되고 이후에 변경이 불가능하다.
2. 데이터를 검색하는 과정에서 시간이 많이 걸린다.
✍ 배열의 크기가 작은 경우가 아니면 탐색에 오래 걸린다.
3. 같은 기본형 데이터 타입의 자료형만 저장할 수 있다.

📌 각 컬랙션 인터페이스의 특징

인터페이스구현 클래스특징
ListLinkedList
Stack
Vector
ArrayList
순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
SetHashSet
TreeSet
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다
MapHashMap
TreeMap
HashTable
Properties
키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다.
순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다.

📌 컬랙션 프레임워크 주요 인터페이스

List 인터페이스

Collection을 확장한 다른 인터페이스와 큰 차이는 없으나, 배열처럼 순서가 있다는 점에서 큰 차이가 있다.

List 인터페이스의 대표 구현 클래스

ArrayList, Vector, Stack, LinkedList가 있다.

List 인터페이스의 대표 구현 클래스의 특징

ArrayList, Vector 클래스의 사용법은 거의 동일하고 기능도 거의 비슷하다. 확장 가능한 배열이라고 생각하면 이해가 쉽다.

📖 ArrayListVector의 차이점
ArrayListNot Thread Safe
VectorThread Safe

📖 Stack
Vector클래스를 확장하여 만들었으며, 만든 이유는 LIFO를 지원하기 위함이다.
📖 LinkedList는 "목록"에도 속하지만, "큐"에도 속한다.

1-1. ArrayList

📖 ArrayList의 상속 관계
java.lang.Object
  ↳ java.util.AbstractCollecion<E>
    ↳ java.util.AbstractList<E>
      ↳ java.util.Arraylist<E>

📖 ArrayList가 구현한 인터페이스

Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

인터페이스용도
Serializble원격으로 객체를 전송하거나, 파일에 저장할 수 있음을 지정
CloneableObject 클래스의 clone() 메소드가 제대로 수행될 수 있음을 지정
즉, 복제가 가능한 객체임을 의미한다.
Iterable<E>객체가 "foreach" 문장을 사용할 수 있음을 지정
Collection<E>여러 개의 객체를 하나의 객체에 담아 처리할 때의 메소드 지정
List<E>목록형 데이터를 처리하는 것과 관련된 메소드 지정
RandomAccess목록형 데이터 보다 빠르게 접근할 수 있도록 임의로 접근하는
알고리즘이 적용된다는 것을 지정

public void checkArrayList() {
    // String 타입의 객체만 넣을 수 있는 ArrayList
    ArrayList<String> list = new ArrayList<>();
    // 객체를 선언할 때, 크기를 별도로 지정하지 않으면 초기 크기는 10
}

제네릭<>을 사용하면 컴파일 시점에 타입을 잘못 지정한 부분을 1차로 걸러낼 수 있다.

앞서 언급하였지만, VectorArrayList와 메소드는 약간 상이하고,
ArrayList는 Not Thread Safe, Vector는 Thread Safe하다는 차이가 있다.
ArrayListThread Safe하게 사용하고자 한다면 아래와 같이 객체를 생성해야 한다.

List list = Collections.synchronizedList(new ArrayList(...));

1-2. LinkedList

List Interface를 구현한 또 하나의 클래스로 목록과 FIFO 기능을 구현 할 때 필요한 클래스 구현체이다.

📖 LinkedList 상속 관계

java.lang.Object
  ↳ java.util.AbstractCollecion<E>
    ↳ java.util.AbstractList<E>
      ↳ java.util.AbstractSequentialList<E>
        ↳ java.util.LinkedList<E>

인터페이스용도
Serializble원격으로 객체를 전송하거나, 파일에 저장할 수 있음을 지정
CloneableObject 클래스의 clone() 메소드가 제대로 수행될 수 있음을 지정
즉, 복제가 가능한 객체임을 의미한다.
Iterable<E>객체가 "foreach" 문장을 사용할 수 있음을 지정
Collection<E>여러 개의 객체를 하나의 객체에 담아 처리할 때의 메소드 지정
Deque<E>맨 앞과 맨 뒤의 값을 용이하게 처리하는 큐와 관련된 메소드 지정
List<E>목록형 데이터를 처리하는 것과 관련된 메소드 지정
Queue<E>큐를 처리하는 것과 관련된 메소드 지정

📌 LinkedListListQueue 그리고 Dequeue 인터페이스를 구현하고 있다.

📖 주요 메소드(데이터 삽입)

return typemethod & argsdescription
void
boolean
void
addFirst(Object)
offerFirst(Object)
push(Object)
LinkedList 객체의 가장 앞에 데이터를 추가한다.
boolean
void
boolean
boolean
add(Object)
addLast(Object)
offer(Object)
offerLast(Object)
LinkedList 객체의 가장 뒤에 데이터를 추가한다.
voidadd(int, object)LinkedList 객체의 특정 위치에 데이터를 추가한다.
Objectset(int, Object)LinkedList객체의 특정 위치에 있는 데이터를 수정한다. 그리고 기존에 있던 데이터를 리턴한다.
booleanaddAll(Collection)매개 변수로 넘긴 컬렉션의 데이터를 추가한다.
booleanaddAll(int, Collection매개 변수로 넘긴 컬렉션의 데이터를 지정된 위치에 추가한다.

📖 주요 메소드(데이터 조회)

return typemethod & argsdescription
ObjectgetFirst()
peekFirst()
peek()
element()
LinkedList 객체의 맨 앞에 있는 데이터를 리턴한다.
ObjectgetLast()
peekLast()
LinkedList 객체의 맨 뒤에 있는 데이터를 리턴한다.
Objectget(int)LinkedList 객체의 지정한 위치에 있는 데이터를 리턴한다.

📖 주요 메소드(데이터 포함)

return typemethod & argsdescription
booleancontains(Object)매개 변수로 넘긴 데이터가 있을 경우 true를 리턴한다.
intindexOf(Object)매개 변수로 넘긴 데이터의 위치를 앞에서부터 검색하여 리턴한다. 없으면 -1을 리턴한다.
intlastIndexOf(Object)매개 변수로 넘긴 데이터의 위치를 끝에서부터 검색하여 리턴한다. 없으면 -1을 리턴한다.

📖 주요 메소드(데이터 삭제)

return typemethod & argsdescription
Objectremove()
removeFirst()
poll()
pollFirst()
pop()
LinkedList 객체의 가장 앞에 있는 데이터를 삭제하고 리턴한다.
ObjectpollLast()
removeLast()
LinkedList 객체의 가장 끝에 있는 데이터를 삭제하고 리턴한다.
Objectremove(int)매개 변수에 지정된 위치에 있는 데이터를 삭제하고 리턴한다.
booleanremove(Object)
removeFirstOccurrence(Object)
매개 변수로 넘겨진 객체와 동일한 데이터 중 앞에서부터 가장 처음에 발견된 데이터를 삭제한다.
booleanremoveLastOccurrence(Object)매개 변수로 넘겨진 객체와 동일한 데이터 중 끝에서부터 가장 처음에 발견된 데이터를 삭제한다.

📖 주요 메소드(데이터 하나씩 검색)

return typemethod & argsdescription
ListIteratorlistIterator(int)매개 변수에 지정된 위치부터의 데이터를 검색하기 위한 ListIterator 객체를 리턴한다.
IteratordescendigIterator()LinkedList의 데이터를 끝에서부터 검색하기 위한 Iterator 객체를 리턴한다.

2. Stack

List Interface를 구현한 또 하나의 클래스로 LIFO 기능을 구현 할 때 필요한 클래스이다. *** LIFO : Last In First Out
LIFO를 위해 사용하는 것을 권장하진 않는다. 다만, 사용하고자 한다면 Thread Safe에 맞게 사용하면 된다.

Stack : 상대적으로 성능이 떨어지지만, Thread Safe
ArrayDeque : 상대적으로 성능이 좋지만, Not Thread Safe

📖 Stack 상속 관계

java.lang.Object
  ↳ java.util.AbstractCollecion<E>
    ↳ java.util.AbstractList<E>
      ↳ java.util.Vector<E>
        ↳ java.util.Stack<E>

Super ClassVector이므로 해당 클래스에서 제공하는 모든 메서드를 사용할 수 있다. 그리고 Stack에서 구현한 인터페이스는 ArrayList 클래스에서 구현한 인터페이스와 모두 동일하다.

📖 Stack 클래스는 원래의 취지인 LIFO를 생각한다면 Vector에 속해서는 안된다. 하지만 자바의 하위 호환성을 위해 이 상속 관계를 유지하고 있다고 보면 된다.(JDK 1.0부터 속해왔음...)

📖 주요 메소드

return typemethod & argsdescription
booleanempty()객체가 비어 있는지 확인한다.
Epeek()객체의 가장 위에 있는 데이터를 리턴한다.
Epop()객체의 가장 위에 있는 데이터를 지우고 리턴한다.
Epush(E item)매개 변수로 넘어온 데이터를 가장 위에 저장한다.
Esearch(Object o)매개 변수로 넘어온 데이터의 위치를 리턴한다.

개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍

profile
Jr. Backend Engineer

0개의 댓글