반응형
⭕ 자바 Java | 알고리즘 | 자료구조(Data Structure) - 배열(Array) 리스(List)
두 가지 주요 자료구조인 배열과 리스트는 각각의 특징에 따라 적절한 상황에서 선택되어 사용됩니다.
➡️ 배열(Array)
배열은 연속된 메모리 공간에 값을 저장하는 자료구조입니다. 각 원소는 고유한 인덱스를 가지고 있어 해당 인덱스를 통해 직접 참조할 수 있습니다.
int[] numbers = {1, 3, 5, 7, 9};
배열의 특징
- 인덱스를 통한 직접 접근: 배열은 각 원소가 고유한 인덱스를 가지므로, 해당 인덱스를 사용하여 빠르게 값을 접근할 수 있습니다.
- 값의 삽입 및 삭제 어려움: 새로운 값을 삽입하거나 삭제할 때 주변의 값을 이동시켜야 하므로 연산이 복잡합니다. 예를 들어, 두 번째 값을 삭제하려면 뒤에 있는 값을 앞으로 당겨와야 합니다.
- 크기 고정: 배열은 선언할 때 크기를 지정하며, 이후에 크기를 늘리거나 줄일 수 없습니다.
- 간단한 구조: 구조가 간단하여 코딩 테스트에서 많이 활용됩니다.
배열은 인덱스를 활용해 빠르게 접근할 수 있는 장점이 있지만, 삽입과 삭제가 빈번한 경우에는 비효율적일 수 있습니다.
➡️ 리스트(List)
리스트는 값과 다음 노드를 가리키는 포인터로 이루어진 자료구조입니다. 각 노드는 자기 자신과 다음 노드를 가리키는 포인터를 가지고 있어 순서대로 접근할 수 있습니다.
리스트의 특징
- 인덱스 없음: 리스트는 인덱스가 없어 값을 접근하기 위해서는 처음부터 순서대로 접근해야 합니다.
- 빠른 삽입 및 삭제: 포인터로 연결되어 있어 데이터를 삽입하거나 삭제하는 연산이 빠릅니다.
- 크기 가변적: 리스트는 크기를 별도로 지정할 필요가 없어 크기가 동적으로 변할 수 있습니다.
- 구조 복잡: 포인터를 사용하므로 배열에 비해 구조가 복잡합니다.
리스트는 삽입과 삭제가 빈번한 경우에 효율적이며, 자바 등의 언어에서는 내부적으로 구현된 ArrayList, LinkedList 등이 활용됩니다.
➡️ ArrayList
ArrayList은 가장 간단하면서도 가장 많이 사용되는 리스트 구현체 중 하나입니다. 내부적으로 배열을 사용하여 요소를 저장하며, 동적으로 크기가 조절됩니다. 아래는 ArrayList의 주요 특징입니다.
- 크기가 동적으로 조절되므로 요소를 추가하거나 제거할 때 유리합니다.
- 랜덤 액세스(인덱스를 통한 요소 접근)가 빠르지만, 중간에 요소를 추가 또는 제거할 때는 비효율적일 수 있습니다.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// ArrayList 생성
ArrayList<String> arrayList = new ArrayList<>();
// 요소 추가
arrayList.add("Java");
arrayList.add("Python");
arrayList.add("C++");
// 요소 접근
System.out.println("ArrayList: " + arrayList);
// 특정 인덱스의 요소 변경
arrayList.set(1, "JavaScript");
// 특정 인덱스의 요소 제거
arrayList.remove(0);
// 리스트 순회
for (String language : arrayList) {
System.out.println(language);
}
}
}
➡️ LinkedList
LinkedList는 더블 링크드 리스트 구조를 사용하여 요소를 저장하는 리스트 구현체입니다. 각 노드는 데이터와 다음 노드, 이전 노드의 주소를 가지고 있습니다. 아래는 LinkedList의 주요 특징입니다.
- 요소를 추가하거나 제거할 때, 인덱스에 대한 포인터 이동이 필요하므로 ArrayList보다 추가/제거가 빠릅니다.
- 랜덤 액세스가 ArrayList에 비해 상대적으로 느립니다.
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// LinkedList 생성
LinkedList<String> linkedList = new LinkedList<>();
// 요소 추가
linkedList.add("Java");
linkedList.add("Python");
linkedList.add("C++");
// 요소 접근
System.out.println("LinkedList: " + linkedList);
// 특정 인덱스의 요소 변경
linkedList.set(1, "JavaScript");
// 특정 인덱스의 요소 제거
linkedList.remove(0);
// 리스트 순회
for (String language : linkedList) {
System.out.println(language);
}
}
}
리스트 선택은 사용하는 상황에 따라 다르며, 추가/제거 작업이 많은 경우에는 LinkedList가 성능상 이점을 가질 수 있습니다. 랜덤 액세스가 주로 이루어지는 경우에는 ArrayList를 고려하는 것이 좋습니다.
반응형
'프론트엔드 > 알고리즘' 카테고리의 다른 글
파이썬 Python | 문자열: count 함수 (81) | 2024.04.21 |
---|---|
파이썬 Python | 알고리즘 | Greedy algorithm(그리디 알고리즘, 탐욕법) (70) | 2024.03.09 |
파이썬 Python | 알고리즘 | Coding Test 준비 (69) | 2024.03.09 |
자바 Java | 알고리즘 | 배열 (77) | 2024.03.06 |
자바 Java | 알고리즘 | 디버깅 (81) | 2024.01.09 |
자바 Java | 알고리즘 | 시간복잡도 (82) | 2024.01.08 |
자바 JAVA | 백준 9498번 시험 성적 | 조건문을 이용한 시험 성적 출력 프로그램 (0) | 2022.09.28 |
자바 JAVA | 백준 1330번 두 수 비교하기 | 조건문(if-else) 활용 (0) | 2022.09.28 |