Java의 정석 (컬렉션 프레임웍)1-1

ITKHJ·2023년 2월 21일
0

Java

목록 보기
6/12
post-thumbnail

컬렉션 프레임웍이란?

"데이터 군을 저장하는 클래스들을 표준화한 설계"를 뜻한다.

컬렉션 프레임웍의 핵심 인터페이스

1.List

-순서가 있는 데이터의 집합

-데이터의 중복을 허용한다.

-구현클래스: ArrayList, LinkedList, Stack, Vector 등

2.Set

-순서를 유지하지 않는 데이터의 집합

-데이터의 중복을 허용하지 않는다.

-구현클래스: HashSet, TreeSet 등

3.Map

-키와 값의 쌍으로 이루어진 데이터의 집합

-순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.

-구현클래스: HashMap, TreeMap, Hashtable, Properties 등

-컬렉션 프레임웍의 모든 컬렉션 클래스들은 List,Set,Map 중의 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 클래스의 이름에 포함되어있어서 이름만으로도 클래스의 특징을 쉽게 알 수 있도록 되어있다.

-Vector나 Hashtable과 같은 기존의 컬렉션 클래스들을 호환을 위해, 설계를 변경해서 남겨두었지만 가능하면 사용하지 않는 것이 좋다 그 대신 새로 추가한 ArrayList와 HashMap을 사용하자.

Collection인터페이스

-Collection인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고, 삭제하는 등 컬렉션을 다루는데 가장 기본적인 메서드들을 정의하고 있다.

List인터페이스

-List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.

Set인터페이스

-Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지않는 컬렉션 클래스를 구현하는데 사용된다.

-Set인터페이스를 구현한 클래스로는 HashSet,TreeSet등이 있다.

Map인터페이스

-Map인터페이스는 키(key)와 값(Value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용된다.

-키는 중복될 수 없지만 값은 중복을 허용한다.

-기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게된다.

-Map인터페이스를 구현한 클래스로는 Hashtable, HashMap, LinkedHashMap, SortMap, TreeMap등이 있다.

Set keySet() : Map에 저장된 모든 key객체를 반환한다.
Collection values() : Map에 저장된 모든 Value객체를 반환한다.
Map인터페이스에서 값은 중복이 허용하기 때문에 Collection타입으로 반환하고, 키는 중복이 허용되지 않기 때문에 Set타입으로 반환한다.

ArrayList

-ArrayList는 Object배열을 이용해서 데이터를 순차적으로 저장한다.

-배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장된다.

-만일 변수 i를 증가시켜가면서 삭제하면, 한 요소가 삭제될 때마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 하기 때문에 올바른 결과를 얻을 수 없다.

-그래서 제어변수를 감소시켜가면서 삭제를 해야 자리이동이 발생해도 영향을 받지 않고 작업이 가능하다.

LinkedList

-배열은 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다는 장점을 가지고 있다.

다음같은 단점도 가지고 있다.

1.크기를 변경할 수 없다.

2.비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

-배열 단점을 보완하기 위해 링크드 리스크(Linked list)라는 자료구조가 고안되었다.

-배열은 모든 데이터가 연속적으로 존재하지만 링크드 리스크는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있다.

-링크드 리스트는 이동방향이 단방향이기 때문에 다음 요소에 대한 접근을 쉽지만, 이전요소에 대한 접근은 어렵다. 이점을 보완한 것이 더블 링크드 리스트(이중연결리스트)이다.

-더블 링크드 리스트는 단순히 링크드 리스트에 참조변수를 하나 더 추가하여 다음 요소에 대한 참조뿐 아니라 이전 요소에 대한 참조가 가능하도록 했을뿐, 그 외에는 링크드리스트와 같다.

-더블링크드 리스트의 접근성을 보다 향상시킨 것이 더블 써큘러 링크드 리스트(이중 원형 연결 리스트)인데, 단순히 더블링크드리스트의 첫번째 요소와 마지막 요소를 서로 연결시킨 것이다.

-이렇게 하면 마지막요소의 다음요소가 첫번째 요소가 되고, 첫번째 요소의 이전 요소가 마지막 요소가 된다.

-실제로 LinkedList클래스는 더블링크드 리스트로 구현되어 있다.

결론

1.순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.

2.중간데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.

Stack과 Queue

-스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO(Last In First Out)구조로 되어있다.

-큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out)구조로 되어있다.

PriorityQueue

-Queue인터페이스의 구현체 중의 하나로, 저장된 순서에 관계없이 우선순위가 높은 것부터 꺼내게 된다는 특징이있다.

  • null은 저장할 수 없다. null을 저장하면 NullPointerException이 발생한다.

Deque(Double-Ended Queue)

-Queue의 변형으로 한 쪽 끝으로만 추가/삭제할 수 있는 Queue와 달리 Deque(덱 또는 디큐라고 읽음)은 양쪽 끝에 추가/삭제가 가능하다.

-Deque의 조상은 Queue이며, 구현체로는 ArrayDeque과 LinkedList 등이 있다.

-덱은 스택과 큐를 하나로 합쳐놓은 것과 같으며 스택으로 사용할 수도 있고, 큐로 사용할 수도 있다.

profile
모든 업무 지식 작성하자!

0개의 댓글