본문 바로가기

Java

자바의 Collection

자바에는 기본적으로 배열이라는 자료구조를 제공해 준다. 그치만 배열이 있음에도 불구하고 컬렉션을 사용하는 이유는 다음과 같다.

 

1. 일괄된 API : Collection의 일관된 API를 사용하여 Collection 밑에 있는 모든 클래스(ArrayList, Vector, LinkedList 등) Collection에서 상속받아 통일된 메서드를 사용하게 됩다.

2. 프로그래밍 노력 감소 : 객체 지향 프로그래밍의 추상화의 기본 개념이 성공적으로 구현되어있다.

3. 프로그램 속도 및 품질 향상 : 유용한 데이터 구조 및 알고리즘은 성능을 향상시킬 수 있다. Collection을 사용하면 자료구조에 대한 알고리즘의 구현을 생각할 필요없이 간단하게 Collection API를 사용하여 구현을 하면 됩다.

 

이렇든 컬렉션이라는 자료구조를 이용해서 우리는 더욱 품질 좋은 소프트웨어를 개발할 수 있다. 이를 위해선 컬렉션의 개념을 잘 잡고 가는게 필수적이다. 다음으로 컬렉션에 대해서 공부해보자

컬렉션이란

컬렉션이란 자바에서 목록성 데이터를 담기 위한 자료구조로 List, Set, Map이 있다. 

이중에서 Map은 Collection인터페이스를 상속받지 않았다.

 

자료구조(Data Structure)는 어떤 정보를 담는 것을 의미하여, 하나의 데이터가 아닌 여러 데이터를 담을 때 사용하는 것이다.

 

배열이 가장 기본적인 자료구조이며 한가지 타입에 대해서, 하나의 변수에 여러 개의 데이터를 넣을 수 있다.

 

List

List는 데이터를 순서에 맞게 일렬로 구성하는데, 인덱스가 부여되기에 인덱스로 검색 할 수 있다.

데이터의 중복을 허용하며  그 종류에는 ArrayList, LinkedList, Stack, Vector가 존재한다.

 

이중 우리는 ArrayList를 많이 이용하는데 옆에 비슷해 보이는 LinkedList, 그리고 배열과는 어떻게 다른지 구조를 살펴보도록 하자.

 

ArrayList

ArrayList는 크기가 가변적으로 변하는 선형리스트이다. 일반적인 배열과 같은 순차 리스트이며 인덱스로 내부의 객체를 관리하는 점이 배열과 동일하지만, 배열은 한번 선언하면 크기를 변경할 수 없는데 반하여 ArrayList는 크기를 가변적으로 변화시킬 수 있다는 점에서 차이를 갖는다. 

 

ArrayList의 내부

초기에 ArryList의 크기는 10으로 할당되어 있다. 10개보다 많은 데이터가 들어가게 된다면 ArrayList는 약 1.5배의 크기를 ((기존의크기 + 기존의 크기) / 2)가진 새로운 ArrayList를 만든후 기존의 ArrayList에 있는 값들을 넣는다. 그런 후 기존에 사용하던 ArrayList는 버린다. 따라서 ArrayList는 인덱스를 기반으로 하기에 탐색에 대한 속도는 빠르지만 삽입과 같은 연산에서는 사이즈를 늘려주고 복사하는 과정을 거쳐야 하기에 효율적이지는 못하다.

 

LinkedList

LinkedList는 각 노드가 데이터와 포인터를 갖고 체인 형태로 연결된 자료구조를 말한다. 기본적으로 자바에서는 각 노드가 앞뒤의 노드를 알고있는 doublyLinkedList를 제공한다. 

 

LinkedList의 내부

위의 LinkedList의 정의에 의해서 연결리스트에 값을 넣거나 삭제할때 전체의 인덱스의 구조가 밀리지 않고 각 노드의 포인터만 변경이 된다. 따라서 ArrayList에 비해서 값을 넣거나 뺼 때 배열을 새로 생성하고 복사하는 과정이 없기에 더 빠르지만 인덱스를 통해서 조회를 할수 없어 순차적으로 조회해야 한다.(연결리스트의 중간에 값을 넣을때 그 값에 도달 할때까지 순차적으로 조회를 하면서 가야함을 의미)

 

Vector

동적 배열을 제공하고, 표준 배열보다 느리지만 많은 움직임이 필요한 프로그램에서 유용합니다.

ArrayList와 유사하다.

하지만 차이점은 Vector는 동기화가 되고, ArrayList는 동기화가 되지 않는다는 차이점이 있다,

Stack

스택 클래스 모델 및 스택 데이터 구조를 구현할 때 주로 사용한다.

후입선출을 기본 원칙으로 한다.

 

Set

Set은 중복된 요소를 포함할 수 없으며, 인덱스를 사용하지 않는다. 종류에는 HashSet, LinkedHashSet, TreeSet이 있다.

 

  • HashSet
    HashSet은 해싱을 이용하여 구현되어 있으며, 순서를 예측할 수 없다.
  • LinkedHashSet
    HashSet과 유사하지만, 데이터를 저장하는 순서를 유지한다.
  • TreeSet
    Tree를 이용해 구현되어 있으며, 정렬 방법을 지정할 수 있다.

성능

이 중에서 성능은 HashSet > TreeSet > LinkedHashSet 순서이다.

 

HashSet은 정렬이 되어있지 않아 TreeSet보다 빠르며 성능이 가장 좋다.

 

Map

Map은 Key와 Value로 구성된 객체를 저장한다. 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다. 종류에는 HashMap, TreeMap, LinkedHashMap, Hashtable이 있다.

 

  • Hashtable
    - HashMap보다는 느리지만 동기화 지원
    - null불가
  • HashMap
    - 중복과 순서가 허용되지 않으며 null값이 올 수 있다.
  • TreeMap
    - 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름
  • LinkedHashMap

'Java' 카테고리의 다른 글

if-else 문과 switch, enum  (0) 2023.01.19
자바의 변수와 타입  (0) 2023.01.19
JVM & GC  (2) 2022.11.29
객체지향 프로그래밍  (2) 2022.11.10