본문 바로가기
개발/Java

[Java] 정리해서 다시보자 #1 - List Collection

by onethejay 2022. 12. 14.
728x90

시작하기 전에

안녕하세요. 원더제이입니다.
9월에 마지막 개발 관련 글을 업로드 한 이후 코틀린을 활용해 간단한 서비스를 만들어 볼까 했었습니다.
5회 정도까지 작성하던 중 다니던 회사에서 퇴사하고 다른 곳으로 이직하고자 준비해왔는데요.
과제와 면접을 진행하면서.. 저는 그저 단순히 스프링만을 사용하고 있었다는 생각이 들었습니다.
자바 버전은 벌써 18까지 나왔는데 저는 아직도 8, 11에 머물러 있으면서 8과 11에서 제공하는 기능들도 제대로 활용하지 못하고 있었더라구요.
그래서 이번 기회에 정리하면서 자바를 좀 더 잘 다뤄보고자 합니다.
새로운 버전이 나오면서 많은 기능이 추가되었지만, 현재 많이 사용중인 11로 정리 시작합니다.

Collection

자바 Collection은 Collection Framework를 의미합니다.
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합입니다.
즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.
또한, Collection은 인터페이스(interface)를 사용하여 구현됩니다.

주요 인터페이스와 특징

  • List
  • Set
  • Map

이 중에서 List와 Set은 모두 Collection 인터페이스를 상속 받으나, Map은 구조상 차이로 인해 별도로 정의됩니다.

인터페이스 설명 구현 클래스
List<E> 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용함. Vector, ArrayList, LinkedList, Stack, Queue
Set<E> 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않음. HashSet, TreeSet
Map<K, V> 키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없음.
이때 키는 중복을 허용하지 않지만, 값은 중복될 수 있음.
HashMap, TreeMap, Hashtable, Properties

List 컬렉션 클래스

모든 List 컬렉션 클래스는 다음의 특징을 가집니다.

  • 요소의 저장 순서가 유지됩니다.
  • 같은 요소의 중복을 허용합니다.

대표적인 클래스는 다음과 같습니다.

  1. ArrayList<E>
  2. LinkedList<E>
  3. Vector<E>
  4. Stack<E>

ArrayList

ArrayList는 가장 많이 사용되는 컬렉션 클래스 중 하나입니다.
내부적으로 배열을 이용하여 요소를 저장하며 인덱스를 이용해 배열 요소에 빠르게 접근이 가능합니다.
하지만 배열은 크기를 변경할 수 없는 인스턴스이므로, 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존의 요소를 옮겨야 하는 과정을 거쳐야 합니다.
해당 과정은 자동으로 수행되지만 요소의 추가 및 삭제 작업에 걸리는 시간이 매우 길어지는 단점이 있습니다.

LinkedList

LinkedList는 ArrayList가 배열을 이용하여 요소를 저장함으로써 발생하는 점을 극복하기 위해 고안되었습니다.
LinkedList는 단일 연결 리스트와 이중 연결 리스트가 있습니다.

  • 단일 연결 리스트는 요소의 다음 요소만 가리키는 참조만 변경되므로 아주 빠르게 처리될 수 있으나, 이전 요소로 접근하기 어렵다는 단점이 있습니다.
  • 이중 연결 리스트는 단일 연결 리스트의 단점인 이전 요소 접근을 보완하기 위해 이전 요소를 가리키는 참조가 추가되었습니다.

LinkedList 클래스는 이중 연결 리스트가 구현되어 있습니다.

ArrayList와 LinkedList는 모두 List 인터페이스를 구현하므로 사용할 수 있는 메소드가 같습니다.

Vector

Vector는 낮은 JDK 버전에서 사용해 온 클래스로, ArrayList와 같은 동작을 수행합니다.
이전 버전의 기존 코드와의 호환성을 위해서만 남아있으므로 Vector보다는 ArrayList를 사용하는 것이 좋습니다.

Stack과 Queue

Stack는 순서대로 요소를 저장합니다.
흔히 아래가 막힌 긴 원통에 원통 모양의 블럭을 하나씩 쌓는 것으로 예시를 들어 설명합니다.
처음 넣은 요소는 가장 마지막에 나오는 형태를 가지고 있습니다. (Last In First Out - LIFO)

Queue 역시 순서대로 요소를 저장합니다.
그러나 Stack과 달리 아래가 뚫려있는 원통으로 설명하며 처음 넣은 요소가 가장 처음에 나오는 형태를 가지고 있습니다. (First In First Out - FIFO)

ArrayList VS LinkedList

적은 양의 데이터를 다룰 때는 ArrayList와 LinkedList의 속도 차이가 거의 없지만,
대용량의 데이터를 다룰 때는 순차적인 데이터인지, 중간 연산 작업이 필요한 데이터인지 생각해보아야 합니다.

  • ArrayList는 사이즈가 한정되어 있으나 LinkedList는 메모리의 용량이 무한정이라면 데이터 역시 무한으로 저장이 가능합니다.
  • ArrayList는 순차적인 데이터 조회가 많을 경우 빠르게 접근할 수 있는 인덱스를 가지고 있어 유리합니다. 그러나 리스트의 중간에 데이터 추가, 삭제가 발생할 경우 인덱스의 변경이 일어나야 하므로 성능이 저하됩니다.
  • LinkedList는 ArrayList와 반대로 데이터의 중간에 추가, 삭제가 발생할 경우 인덱스 변경이 필요하지 않아 성능저하가 발생하지 않습니다. 추가, 삭제할 위치의 이전 요소의 다음 주소값과 다음 요소의 이전 주소값에 작업되기 때문입니다. 그러나 데이터를 조회 할 경우 인덱스가 없어 순차적으로 조회해야 하므로 속도가 저하됩니다.

참고

http://www.tcpschool.com/java/java_collectionFramework_concept
https://www.nextree.co.kr/p6506/

728x90

댓글