배열(Array)은 동일한 데이터 타입의 요소들을 연속적인 메모리 공간에 저장하는 자료구조입니다. 배열은 인덱스를 통해 요소에 빠르게 접근할 수 있는 장점이 있습니다.
배열의 특징
- 고정된 크기: * 배열의 크기는 선언 시에 결정되며, 이후 변경할 수 없습니다. 예를 들어, int[] arr = new int[10];는 크기가 10인 정수형 배열을 선언합니다.
- 연속적인 메모리 할당: * 배열의 요소들은 연속적인 메모리 위치에 저장됩니다. 이는 인덱스를 사용한 빠른 접근을 가능하게 합니다.
- 동일한 데이터 타입: * 배열은 동일한 데이터 타입의 요소들로 구성됩니다. 모든 요소는 동일한 타입이어야 합니다.
- 인덱스를 통한 접근: * 배열의 요소들은 0부터 시작하는 인덱스를 통해 접근할 수 있습니다. 예를 들어, arr[0]은 배열의 첫 번째 요소를 가리킵니다.
배열의 장단점
- 장점
- 빠른 접근: 인덱스를 통해 임의의 위치에 있는 요소에 O(1) 시간에 접근할 수 있음
- 메모리 효율성: 연속적인 메모리 할당으로 인해 메모리 사용이 효율적
- 단점
- 고정된 크기: 배열의 크기는 선언 시에 결정되며, 이후 변경할 수 없음
- 삽입/삭제의 비효율성: 배열의 중간에 요소를 삽입하거나 삭제하는 경우, 요소들을 이동시켜야 하므로 O(n)의 시간이 걸림
배열의 주요 연산
- 접근 (Access): * 배열의 특정 인덱스에 있는 요소에 접근하는 연산. 시간 복잡도는 O(1)
- 검색 (Search): * 배열에서 특정 값을 검색하는 연산. 최악의 경우 모든 요소를 검사해야 하므로 시간 복잡도는 O(n)
- 삽입 (Insert) * 배열의 특정 위치에 새로운 값을 삽입하는 연산. 배열의 크기가 고정되어 있어 배열의 끝에 삽입하는 경우를 제외하면 요소들을 이동시켜야 하므로 시간 복잡도는 O(n)
- 삭제 (Delete) * 배열의 특정 위치에 있는 값을 삭제하는 연산. 삭제 후에도 요소들을 이동시켜야 하므로 시간 복잡도는 O(n)
배열의 사용 예제
public class ArrayExample {
public static void main(String[] args) {
// 배열 선언 및 초기화
int[] numbers = {10, 20, 30, 40, 50};
// 배열의 요소에 접근
System.out.println("첫 번째 요소: " + numbers[0]); // 10
// 배열의 요소 변경
numbers[1] = 25;
System.out.println("두 번째 요소: " + numbers[1]); // 25
// 배열의 길이
System.out.println("배열의 길이: " + numbers.length); // 5
// 배열의 모든 요소 출력
System.out.print("배열의 요소: ");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
System.out.println();
// 배열에서 요소 검색
int searchValue = 30;
boolean found = false;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == searchValue) {
found = true;
break;
}
}
if (found) {
System.out.println(searchValue + " 값을 찾았습니다.");
} else {
System.out.println(searchValue + " 값을 찾지 못했습니다.");
}
// 배열에서 요소 삽입
int insertIndex = 2;
int newValue = 35;
for (int i = numbers.length - 1; i > insertIndex; i--) {
numbers[i] = numbers[i - 1];
}
numbers[insertIndex] = newValue;
System.out.print("삽입 후 배열의 요소: ");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
System.out.println();
// 배열에서 요소 삭제
int deleteIndex = 3;
for (int i = deleteIndex; i < numbers.length - 1; i++) {
numbers[i] = numbers[i + 1];
}
numbers[numbers.length - 1] = 0;
System.out.print("삭제 후 배열의 요소: ");
for (int i = 0; i < numbers.length; i++) {
System.out.print(numbers[i] + " ");
}
System.out.println();
}
}
배열의 다양한 유형
- 1차원 배열 (One-Dimensional Array)
- 2차원 배열 (Two-Dimensional Array)
- 다차원 배열 (Multi-Dimensional Array)
int[] arr = {1, 2, 3, 4, 5};
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int[][][] cube = {
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
},
{
{10, 11, 12},
{13, 14, 15},
{16, 17, 18}
},
{
{19, 20, 21},
{22, 23, 24},
{25, 26, 27}
}
};
배열은 기본적인 자료구조로, 다양한 알고리즘과 데이터 구조의 기반이 됩니다. 배열을 잘 이해하고 활용하는 것은 프로그래밍에서 매우 중요합니다.