반응형
자료구조 중 배열(Array)에 대해 정리해보자.
배열(Array)이란?
배열(Array)은 자료구조 중 하나로, 동일한 데이터 타입의 요소들을 연속된 메모리 공간에 저장하는 방법이다.
배열은 인덱스(index)를 사용해 각 요소에 접근할 수 있다. 이러한 특징 때문에 배열은 데이터의 순서를 유지하고, 특정 위치의 요소에 빠르게 접근할 수 있는 장점이 있다.
배열(Array)의 장점 및 단점
장점
- 빠른 접근 : 배열은 인덱스를 사용하여 요소에 빠르게 접근할 수 있다. 인덱스를 알고 있다면 원하는 위치의 요소에 상수 시간(O(1))에 접근할 수 있다.
- 메모리 공간의 효율성 : 배열은 연속된 메모리 공간에 요소를 저장하므로, 메모리 공간을 효율적으로 사용할 수 있다. 또한, 요소들은 순서대로 저장되기 때문에 인접한 요소들에 대한 캐시 지역성이 좋아 성능 향상에 도움을 줄 수 있다.
- 다차원 배열 : 배열은 다차원으로 선언할 수 있다. 이를 통해 행렬과 같은 다차원 데이터를 표현할 수 있다.
단점
- 크기 제한 : 배열은 생성할 때 크기를 정하고 이 크기를 변경할 수 없다. 따라서 미리 최대 크기를 예상하여 배열을 생성해야 하며, 크기를 동적으로 조정할 수 없는 제약이 있다.
- 삽입과 삭제의 어려움 : 배열은 요소를 삽입하거나 삭제하는 작업에 비용이 크다. 배열의 중간에 요소를 삽입하거나 삭제할 경우 해당 위치 이후의 요소들을 모두 이동시켜야 하기 때문이다. 이로 인해 시간 복잡도가 O(n)이 되어 성능 저하가 발생할 수 있다.
Java에서의 배열 선언 및 사용 방법
배열 선언과 초기화
- 배열을 선언하기 위해서는 배열의 타입과 크기를 지정해야 한다.
- 다음은 int 타입의 배열을 선언하고 크기가 5인 배열을 초기화하는 예시다.
int[] numbers = new int[5];
배열에 값 할당
- 배열에 값을 할당하려면 인덱스를 사용해 특정 위치에 값을 대입한다.
- 인덱스는 0부터 배열의 크기보다 1 작은 값까지 유효하다.
- 다음은 배열의 인덱스 0부터 4까지 값을 할당하는 예시다.
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
배열의 값 참조
- 배열의 값을 참조하기 위해서도 인덱스를 사용한다.
- 다음은 배열의 인덱스 2에 해당하는 값을 출력하는 예시다.
System.out.println(numbers[2]);
배열의 길이
- 배열의 길이는 length 속성을 사용하여 알 수 있다.
- 다음은 배열의 길이를 출력하는 예시다.
System.out.println(numbers.length); // 5
배열 반복문
- 배열의 모든 요소에 접근하기 위해 반복문을 사용할 수 있다.
- 다음은 for 반복문을 사용하여 배열의 모든 값을 출력하는 예시다.
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
(+) ArrayList란?
앞서 말했듯 배열(Array)은 정적인 크기를 가지고 있기 때문에 크기를 변경할 수 없다.
만약 크기를 동적으로 변경해야 한다면, Java에서는 ArrayList와 같은 동적 배열을 사용할 수 있다.
ArrayList에 대해 하나씩 알아보자.
ArrayList의 특징과 동작 방식
- 동적 크기 조정 : ArrayList는 내부적으로 배열을 사용하며, 요소를 추가하거나 삭제할 때 필요에 따라 크기를 동적으로 조정할 수 있다. 크기가 자동으로 조정되므로 크기 제한이 없고, 유연하게 요소를 관리할 수 있다는 장점이 있다.
- 제네릭 타입 : ArrayList는 제네릭을 사용하여 요소의 타입을 지정할 수 있습니다. 예를 들어, ArrayList<Integer>는 정수형 요소만 저장하는 리스트를 생성한다. 이를 통해 타입 안정성을 제공하며, 잘못된 타입의 요소를 추가하는 것을 방지할 수 있다.
- 요소 접근 : ArrayList는 인덱스를 사용해 요소에 접근할 수 있다. 인덱스는 0부터 시작하며, 해당 인덱스에 접근하여 값을 읽거나 변경할 수 있다. 인덱스를 사용하여 요소에 빠르게 접근할 수 있다.
- 요소 추가와 삭제 : ArrayList는 요소를 추가하거나 삭제하는 메서드를 제공한다. add() 메서드를 사용해 리스트의 끝에 요소를 추가하거나, 특정 인덱스에 요소를 삽입할 수 있다. remove() 메서드를 사용하면 특정 인덱스나 값에 해당하는 요소를 삭제할 수 있다. 이렇게 ArrayList는 내부적으로 요소를 이동시키는 작업을 처리하기 때문에 사용자는 이에 대한 고려를 하지 않아도 된다.
- 반복과 순회 : ArrayList는 for 반복문이나 **Iterator**를 사용하여 요소를 반복하고 순회할 수 있다. 이를 통해 리스트의 모든 요소에 접근할 수 있다.
- 기타 기능 : ArrayList는 다양한 메서드를 제공하여 요소의 검색, 정렬, 복사, 부분 리스트 생성 등의 기능을 수행할 수 있다. 예를 들어, contains() 메서드를 사용하여 특정 값이 리스트에 있는지 확인할 수 있다.
정리해보면 ArrayList는 배열과 비교해 크기 조정과 요소 추가/삭제가 효율적인, 유연성과 편리성을 제공하는 자료구조라고 볼 수 있다.
하지만 요소의 추가/삭제 작업이 빈번하게 발생하는 경우에는 성능이 저하될 수 있으며, 특정 위치의 요소에 접근할 때는 배열보다 느릴 수 있다.
따라서, 요소의 추가/삭제가 빈번하지 않고 요소의 순차적인 접근이 주로 필요한 경우에 ArrayList를 활용하는 것이 적합하다.
참고로 요소의 추가/삭제가 빈번하게 발생하는 상황에서는 LinkedList와 같은 자료구조가 더 효율적일 수 있다. LinkedList는 요소의 추가/삭제 작업이 빠르며, 요소의 순차적인 접근은 상대적으로 느리다.
Java에서의 ArrayList 사용 방법
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
// Integer 타입의 요소를 저장하는 ArrayList 생성
ArrayList<Integer> numbers = new ArrayList<>();
// 요소 추가
numbers.add(10);
numbers.add(20);
numbers.add(30);
// 요소 접근
System.out.println(numbers.get(0)); // 10
System.out.println(numbers.get(1)); // 20
System.out.println(numbers.get(2)); // 30
// 요소 수정
numbers.set(1, 50);
// 요소 삭제
numbers.remove(0);
// 리스트 크기 출력
System.out.println(numbers.size()); // 2
// 리스트 순회
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
}
}
반응형
'자료구조 & 알고리즘' 카테고리의 다른 글
[자료구조] 스택(Stack) 자료구조 알아보기 & Java 예제 코드 (1) | 2023.06.06 |
---|---|
[자료구조] 연결 리스트(LinkedList) 자료구조 알아보기 & Java 예제 코드 (0) | 2023.06.04 |
[자료구조] 우선순위 큐(Priority Queue)와 힙(Heap) (0) | 2022.12.25 |
[백준] 10828 스택 자바 문제 풀이(시간 초과 해결) (0) | 2022.07.24 |
[기초 자료구조] Stack(스택) - Array 기반 / LinkedList 기반 (0) | 2022.07.24 |