배열

배열(Array)은 동일한 데이터 타입의 요소들을 연속적인 메모리 공간에 저장하는 자료구조입니다. 배열은 인덱스를 통해 요소에 빠르게 접근할 수 있는 장점이 있습니다.

배열의 특징

  1. 고정된 크기: * 배열의 크기는 선언 시에 결정되며, 이후 변경할 수 없습니다. 예를 들어, int[] arr = new int[10];는 크기가 10인 정수형 배열을 선언합니다.
  2. 연속적인 메모리 할당: * 배열의 요소들은 연속적인 메모리 위치에 저장됩니다. 이는 인덱스를 사용한 빠른 접근을 가능하게 합니다.
  3. 동일한 데이터 타입: * 배열은 동일한 데이터 타입의 요소들로 구성됩니다. 모든 요소는 동일한 타입이어야 합니다.
  4. 인덱스를 통한 접근: * 배열의 요소들은 0부터 시작하는 인덱스를 통해 접근할 수 있습니다. 예를 들어, arr[0]은 배열의 첫 번째 요소를 가리킵니다.

배열의 장단점

  • 장점
    • 빠른 접근: 인덱스를 통해 임의의 위치에 있는 요소에 O(1) 시간에 접근할 수 있음
    • 메모리 효율성: 연속적인 메모리 할당으로 인해 메모리 사용이 효율적
  • 단점
    • 고정된 크기: 배열의 크기는 선언 시에 결정되며, 이후 변경할 수 없음
    • 삽입/삭제의 비효율성: 배열의 중간에 요소를 삽입하거나 삭제하는 경우, 요소들을 이동시켜야 하므로 O(n)의 시간이 걸림

배열의 주요 연산

  1. 접근 (Access): * 배열의 특정 인덱스에 있는 요소에 접근하는 연산. 시간 복잡도는 O(1)
  2. 검색 (Search): * 배열에서 특정 값을 검색하는 연산. 최악의 경우 모든 요소를 검사해야 하므로 시간 복잡도는 O(n)
  3. 삽입 (Insert) * 배열의 특정 위치에 새로운 값을 삽입하는 연산. 배열의 크기가 고정되어 있어 배열의 끝에 삽입하는 경우를 제외하면 요소들을 이동시켜야 하므로 시간 복잡도는 O(n)
  4. 삭제 (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. 1차원 배열 (One-Dimensional Array)
  2. 2차원 배열 (Two-Dimensional Array)
  3. 다차원 배열 (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}
    }
};

배열은 기본적인 자료구조로, 다양한 알고리즘과 데이터 구조의 기반이 됩니다. 배열을 잘 이해하고 활용하는 것은 프로그래밍에서 매우 중요합니다.