배열 (Array)의 개념 및 구현

2024. 10. 27. 04:46Data Structure

배열(Array)은 데이터를 연속적인 메모리 공간에 저장하는 자료구조입니다.
배열은 데이터를 순차적으로 저장하고 접근할 수 있어 다양한 상황에서 유용하게 사용되며,
프로그래밍에서 가장 기본적인 자료구조로 간주됩니다.

이 포스팅에서는 배열의 기본 개념, 특징, 장단점, 그리고 배열의 구현 방식을 자세히 설명하겠습니다.


1. 배열의 개념

배열은 동일한 데이터 타입의 값을 일정한 크기로 연속된 메모리 공간에 저장하는 자료구조입니다. 배열의 각 요소(Element)는 고유한 인덱스(Index)를 가지고 있으며, 이 인덱스를 통해 배열에 저장된 데이터에 접근할 수 있습니다.

배열의 구조

예를 들어, 정수형 배열이 [10, 20, 30, 40, 50]의 값을 갖는다면, 배열 내 각 요소의 인덱스는 다음과 같습니다.

인덱스(Index) 0 1 2 3 4
값(Value) 10 20 30 40 50

위와 같은 배열에서 array[2]를 통해 인덱스 2에 있는 30을 가져올 수 있습니다.


2. 배열의 특징

  • 연속적인 메모리 배치: 배열의 각 요소는 메모리 상에 연속적으로 저장되므로, 특정 인덱스에 바로 접근할 수 있습니다.
  • 정적 크기: 일반적으로 배열은 선언할 때 크기가 정해지며, 이후 변경할 수 없습니다.
  • 빠른 접근 속도: 인덱스를 통해 배열의 요소에 직접 접근하므로, 접근 속도가 빠릅니다(O(1)).
  • 순차적인 데이터 처리: 배열은 데이터가 순차적으로 저장되기 때문에 반복문을 통해 순차적인 데이터 처리에 용이합니다.

3. 배열의 장단점

장점

  • 빠른 데이터 접근: 배열의 인덱스를 통해 빠르게 원하는 요소에 접근할 수 있습니다.
  • 간단한 구조: 배열은 구조가 단순하고 사용법이 쉬워 초보자도 쉽게 사용할 수 있습니다.

단점

  • 크기 제한: 배열은 선언할 때 크기가 고정되기 때문에, 크기를 동적으로 변경할 수 없습니다.
  • 데이터 삽입/삭제의 비효율성: 배열 중간에 요소를 삽입하거나 삭제하면, 나머지 요소들을 이동해야 하므로 비용이 많이 듭니다(O(n)).

4. 배열의 활용 예시

배열은 데이터가 고정된 크기일 때, 인덱스를 사용해 빠르게 접근해야 할 때 유용하게 활용됩니다. 예를 들어:

  1. 학생 성적 관리: 학생들의 성적을 순서대로 저장해, 특정 학생의 성적에 바로 접근하는 경우.
  2. 이미지 처리: 픽셀 데이터 배열을 통해 각 픽셀의 색상 값에 접근해 이미지를 처리하는 경우.
  3. 통계 데이터 분석: 수집된 데이터를 순서대로 저장해 평균이나 중간값을 쉽게 계산하는 경우.

5. 배열의 구현 방법

배열은 다양한 프로그래밍 언어에서 기본 자료형으로 제공됩니다.
다음은 배열의 선언 및 사용을 C# 코드로 구현한 예시입니다.

5.1. 배열 선언 및 초기화

using System;

public class ArrayExample
{
    public static void Main()
    {
        // 정수형 배열 선언 및 초기화
        int[] array = new int[5]; // 크기가 5인 배열 선언
        array[0] = 10;
        array[1] = 20;
        array[2] = 30;
        array[3] = 40;
        array[4] = 50;

        Console.WriteLine("배열 요소:");
        for (int i = 0; i < array.Length; i++)
        {
            Console.WriteLine($"Index {i}: {array[i]}");
        }
    }
}

위 코드에서는 크기가 5인 정수형 배열을 선언한 후, 각 요소에 값을 할당했습니다. 배열의 길이는 array.Length를 통해 가져올 수 있으며, 각 요소에 array[i] 방식으로 접근 가능합니다.

5.2. 배열 초기화 방법

배열은 선언과 동시에 초기화할 수 있습니다.

int[] array = { 10, 20, 30, 40, 50 };

이렇게 초기화하면 별도의 할당 없이 배열을 생성할 수 있습니다.


6. 배열에서의 데이터 삽입과 삭제

배열은 크기가 고정되어 있기 때문에, 특정 위치에 데이터를 삽입하거나 삭제하는 경우 기존의 데이터를 이동시켜야 합니다.

예시: 배열에서 특정 위치에 데이터 삽입하기

int[] array = { 10, 20, 30, 40, 50 };
int[] newArray = new int[6]; // 기존 배열보다 1 큰 배열 생성

// 원래 배열의 요소 복사
for (int i = 0; i < 2; i++)
{
    newArray[i] = array[i];
}
newArray[2] = 25; // 새 요소 삽입
for (int i = 2; i < array.Length; i++)
{
    newArray[i + 1] = array[i];
}

이 코드는 기존 배열의 중간 위치에 새로운 요소를 추가할 때 사용됩니다. 배열의 요소를 이동하여 새로운 값을 삽입하는 방식으로 동작합니다.


7. 배열의 다양한 형태: 다차원 배열과 가변 배열

다차원 배열

C#에서는 행과 열로 구성된 2차원 배열, 또는 그 이상의 다차원 배열을 사용할 수 있습니다.

int[,] matrix = new int[3, 3];

위와 같이 2차원 배열을 선언하면 행과 열로 데이터가 저장됩니다.

가변 배열

C#에서는 가변 배열도 지원하며, 각 행이 다른 길이를 가질 수 있습니다.

int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2];
jaggedArray[1] = new int[3];
jaggedArray[2] = new int[4];

가변 배열은 각 요소가 개별 배열로 존재하므로, 메모리 사용 면에서 더 유연하게 활용할 수 있습니다.


배열은 효율적인 데이터 접근이 필요한 경우에 유용한 자료구조입니다.
배열의 크기가 고정된다는 점에서, 크기를 미리 예측할 수 있는 상황에 적합합니다.
다양한 프로그래밍 언어에서 기본적으로 제공되며,
배열의 연산 특성을 이해하면 데이터 관리와 효율적인 메모리 사용에 큰 도움이 됩니다.