[Java] Arrray(배열), ArrayList, Stack(스택), Queue(큐), LinkedList, Vector 차이점

2023. 4. 5. 01:07프로그래밍/Java

오늘은 JAVA를 공부할 때 비교적 헷갈렸던 개념에 대해서 정리해보고자 한다.

리스트와 배열, 스택과 큐, 어레이리스트, 링크드리스트, 벡터 등등 용어가 비슷하면서도 다르고 개념이 다른 것 같은데 비슷한 모호한 것들이 많이 있었다. 

 

1. Array란?

 

2. ArrayList란?

 

3. Stack이란?

 

4. Queue란?

 

5. LinkedList란?

 

6. Vector란?

 

 

 

더보기
1. Array란?

 

Array는 정확히 말하자면 참조형 변수로서 당연하게도 주소값을 가지고 있다. 이때 배열안에는 인덱스를 가진 각각의 공간이 존재하는데 이 공간에다가 내가 설정한 타입의 변수를 여러개 집어넣을 수 있는 구조이다. 방마다 번호가 저장돼있는데 이를 인덱스라 하며 그렇기 때문에 값의 조회 속도가 빠르다는 장점이 있으나 배열의 길이를 변화시키기에는 까다롭다는 단점이 있다. 

처음에 변수를 선언할 때  역시 배열의 길이를 정해주어야 한다.

 

 

 

 

2. ArrayList란?

 

어레이리스트는 제너릭을 이용해 길이에 가변에 훨씬 효과적인 배열을 뜻한다. 이름은 어레이리스트이지만 실제로 이 어레이리스트는 배열의 생성 원리를 기본으로 동작된다. 제너릭에 대한 개념은 나중에 추후에 공부 후 정리해보도록 하겠다. 우선 현재로서는 ArrayList는 배열과 같은 구조를 가지고 있으나 값의 추가와 삭제가 용이하며 크기가 동적인 배열을 다루는데에 용이하다고 생각하면 되겠다.

 

3. Stack이란?

 

Stack은 JAVA뿐만 아니라 기본적으로 프로그래밍 언어에 있어서 데이터를 처리하는 방식에 대한 개념이다. LIFO(Last In First Out), 즉 후입선출의 구조를 가지고 있으며 이해하기 쉽게 설명한다면 프링글스 과자를 생각하면 된다. 우리가 프링글스를 먹기 위해서는 제일 위부터 먹어야하는 것처럼 Stack 역시 메모리에 올라온 데이터를 처리하는 방법으로 같은 방식을 채택하고 있다. 우리가 일상생활에서 웹 사이트를 서핑할때 뒤로가기를 하면 바로 이전 페이지가 나오는 등의 구조에서 활용되는 것이 이 스택(Stack)의 개념이다. 스택은 후술할 큐(Queue)와 함께 컬렉션 프레임워크에 의해 제공되고 있으며 이에 대한 개념도 추후 정리해보겠다. 

 

4. Queue

 

큐는 FIFO(First In First Out)의 선일선출 개념을 가지고 있는 데이터 처리 방식이다. 바닥이 뚫려있는 프링글스 통을 상상하면 된다. 가장 먼저, 즉 맨밑에 깔려있는 데이터가 가장 먼저 처리되는 구조이다. 

5. LinkedList

 

링크드 리스트는 Header와 여러개의 Node의 구조로 이루어져있다. Head에는 값이 대입되지 않으며 다음 Node의 주소값이 저장돼있다. 그리고첫번째 노드부터는 값을 가지며 역시 그 다음 번째 Node의 주소값을 가지게 된다. 이렇게 꼬리에 꼬리를 물며 서로간의 연결관계를 구축해주는 것이 LinkedList이다. LinkedList는 위의 배열이나 어레이리스트처럼 선형구조이나 주소값이 바로 다음 값에 연결돼있는 형태이기 떄문에 리스트의 조회는 조금 더 오래 걸린다. 하지만 값의 삭제나 추가에 굉장히 용이한데 삭제하고 싶다면 삭제하고자 하는 데이터의 앞의 참조변수에서 바로 뒤의 참조변수의 주소를 저장하면 된다. 추가 역시 마찬가지. 

 

  • ArrayList vs LinkedList
  장점 단점
ArrayList 데이터의 조회가 빠르다. 데이터의 추가 삭제가 빈번한 곳에 사용될 경우 부적합하다.
LinkedList 데이터의 추가 삭제가 용이하다. Head로부터 시작해 다음 노드를 추적하는 방식이기 때문에 조회가 느리다.

 

 

6. Vector

 

Vector 클래스는 JDK1.0부터 사용되어 왔으며 ArrayList와 실행결과는 비슷하지만 내부적으로 세부적인 동작원리는 다르다고 할 수 있다. 아무래도 초창기에 프로그래밍 된 배열의 형태다보니 후에 나온 ArrayList보다 효율적인 측면에서 떨어져 보통은 ArrayList를 사용하는 편이 낫다고 한다.

 

 

 

 

*현재로서는 깊게 파고들기에는 내 실력과 시간이 부족하기 때문에 새로 추가되는 사항이 있으면 언제든지 수정할 예정.