자바에서는 배열과 리스트라는 자료구조가 있다.
두 자료구조 모두 겉으로 봤을 때는 비슷하지만 파헤쳐보면 꽤나 다른 쓰임새를 보인다.
나는 해당 부분에 더 정확한 이해와 알맞은 사용을 위해 공부를 한 후 포스팅해보려고 한다.
배열 (Array)
배열의 정의
- 배열은 고정된 크기의 동일한 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조이다.
- 배열은 인덱스(index)를 사용하여 데이터에 접근하며, 첫 번째 요소의 인덱스는 0이다.
배열에서의 인덱스
- 인덱스는 배열의 각 요소를 식별하고 접근하기 위한 정수 값이다.
- 인덱스를 사용하면 요소에 직접 접근할 수 있어 매우 빠르며, 시간 복잡도는 O(1)이다.
리스트 (List)
리스트의 정의
- 리스트는 자바에서 제공하는 컬렉션 프레임워크(Collection Framework)의 한 구성 요소로, 동적으로 크기를 조절할 수 있는 자료구조이다.
- 리스트는 배열보다 유연하며, 요소를 추가하거나 삭제하는 작업이 간단하다.
리스트에서의 노드
- 리스트 중 LinkedList는 노드(node) 기반의 자료구조이다.
- 노드는 데이터를 저장하는 값(value)과 다음 노드를 가리키는 참조(reference)로 구성된다.
- 노드 기반 구조는 삽입과 삭제가 용이하며, 데이터 크기가 동적으로 변할 때 적합하다.
배열과 리스트의 주요 차이점
특성 | 배열(Array) | 리스트(List) |
크기 | 고정 크기 | 동적 크기 조절 가능 |
데이터 접근 방식 | 인덱스를 사용한 직접 접근 | 노드 기반의 순차 접근 |
삽입/삭제 효율성 | 삽입/삭제가 어렵고 비효율적 | 삽입/삭제가 쉽고 유연함 |
메모리 사용 | 상대적으로 적음 | 더 많은 메모리 사용 |
1. 크기 고정 vs 크기 동적
배열은 크기가 고정되어 있으므로 생성 후 크기를 변경할 수 없지만,
리스트는 필요에 따라 크기를 동적으로 조절할 수 있다.
import java.util.ArrayList;
public class ArrayVsList {
public static void main(String[] args) {
// 배열 생성 (고정 크기)
int[] array = new int[3];
array[0] = 10;
array[1] = 20;
array[2] = 30;
// array[3] = 40; // 오류: 배열의 크기를 초과하여 값 추가 불가
// ArrayList 생성 (동적 크기)
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.add(40); // 동적으로 크기 증가
System.out.print("배열: ");
for (int num : array) {
System.out.print(num + " ");
}
System.out.println("\n리스트: " + list);
}
}
- 출력결과
배열: 10 20 30
리스트: [10, 20, 30, 40]
2. 삽입/삭제의 차이
배열은 특정 위치에 값을 삽입하거나 삭제하기가 번거롭지만, 리스트는 이를 쉽게 처리할 수 있다.
import java.util.ArrayList;
public class ArrayVsListInsertDelete {
public static void main(String[] args) {
// 배열
int[] array = {10, 20, 30, 40};
// 배열에서 요소를 삭제하려면 새로운 배열을 만들어야 함
int[] newArray = new int[array.length - 1];
System.arraycopy(array, 0, newArray, 0, 2); // 10, 20 복사
System.arraycopy(array, 3, newArray, 2, array.length - 3); // 40 복사
// 리스트
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
list.add(40);
list.remove(2); // 30 삭제
System.out.print("배열 (삭제 후): ");
for (int num : newArray) {
System.out.print(num + " ");
}
System.out.println("\n리스트 (삭제 후): " + list);
}
}
- 출력결과
배열 (삭제 후): 10 20 40
리스트 (삭제 후): [10, 20, 40]
3. 접근 속도
배열은 인덱스를 통해 직접 요소에 접근하므로 빠르다(O(1)).
반면, 리스트(특히 LinkedList)는 요소를 순차적으로 탐색해야 하므로 느릴 수 있다(O(n)).
import java.util.ArrayList;
import java.util.LinkedList;
public class ArrayVsListAccess {
public static void main(String[] args) {
// 배열
int[] array = {10, 20, 30, 40};
System.out.println("배열의 2번째 요소: " + array[1]); // 인덱스를 통한 직접 접근
// ArrayList
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(20);
arrayList.add(30);
arrayList.add(40);
System.out.println("ArrayList의 2번째 요소: " + arrayList.get(1)); // 인덱스를 통한 직접 접근
// LinkedList
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.add(10);
linkedList.add(20);
linkedList.add(30);
linkedList.add(40);
System.out.println("LinkedList의 2번째 요소: " + linkedList.get(1)); // 순차 탐색
}
}
- 출력 결과
배열의 2번째 요소: 20
ArrayList의 2번째 요소: 20
LinkedList의 2번째 요소: 20
배열과 리스트 요약
- 배열은 고정된 크기와 빠른 접근 속도가 필요한 경우에 적합하다.
- 리스트는 유연한 크기 조정과 삽입/삭제 작업이 자주 발생하는 경우에 적합하다.
- ArrayList는 배열과 비슷하지만 동적 크기를 제공하며, 검색이 빠르다.
- LinkedList는 노드 기반 구조로 삽입/삭제가 효율적이지만, 검색 속도는 느릴 수 있다.
배열과 리스트는 각각의 특성을 이해하고 적재적소에 활용하는 것이 중요하다.
'개발 > JAVA' 카테고리의 다른 글
[JAVA/자바] 개인 미니 프로젝트 - 호텔 예약 시스템 (0) | 2025.01.29 |
---|---|
[JAVA/자바] StringTokenizer 문자열 분리 (1) | 2024.12.28 |
[JAVA/자바] Scanner와 BufferedReader의 차이 (2) | 2024.12.21 |