C++에서 배열(array)은 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조입니다. C++에는 여러 종류의 배열이 있으며, 각각의 특징과 사용법을 자세히 설명해드리겠습니다.

1. C 스타일 배열 (C-style Array)

기본 선언과 초기화

// 선언과 동시에 크기 지정
int arr1[5];                    // 크기 5인 정수 배열 (초기화되지 않음)
int arr2[5] = {1, 2, 3, 4, 5};  // 초기화 리스트로 초기화
int arr3[] = {1, 2, 3};         // 크기 자동 추론 (크기 3)
int arr4[5] = {1, 2};           // 나머지는 0으로 초기화 {1, 2, 0, 0, 0}
int arr5[5] = {};               // 모든 원소를 0으로 초기화

// 문자 배열
char str1[10] = "Hello";        // null-terminated 문자열
char str2[] = "World";          // 크기 자동 계산 (6: 'W','o','r','l','d','\\0')

접근과 사용

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

// 인덱스를 통한 접근
numbers[0] = 15;                // 첫 번째 원소 수정
int value = numbers[2];         // 세 번째 원소 읽기 (30)

// 포인터를 통한 접근
int* ptr = numbers;             // 배열 이름은 첫 번째 원소의 주소
*(ptr + 1) = 25;                // numbers[1] = 25와 동일

// 크기 계산
size_t size = sizeof(numbers) / sizeof(numbers[0]);  // 5

2. 다차원 배열

2차원 배열

// 2차원 배열 선언과 초기화
int matrix[3][4];                           // 3행 4열 배열
int matrix2[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 또는 일차원처럼 초기화 가능
int matrix3[2][3] = {1, 2, 3, 4, 5, 6};

// 접근
matrix2[1][2] = 100;            // 2행 3열에 100 저장
int val = matrix2[0][1];        // 1행 2열 값 읽기 (2)

3차원 이상 배열

int cube[2][3][4];              // 3차원 배열
cube[0][1][2] = 42;             // 접근

// 초기화
int tensor[2][2][2] = {
    {{1, 2}, {3, 4}},
    {{5, 6}, {7, 8}}
};

3. std::array (C++11)

기본 사용법

#include <array>

// 선언과 초기화
std::array<int, 5> arr1;                    // 기본 초기화 (값 불확정)
std::array<int, 5> arr2 = {1, 2, 3, 4, 5}; // 초기화 리스트
std::array<int, 5> arr3{};                  // 모든 원소 0으로 초기화

// C++17부터 타입 추론 가능
std::array arr4{1, 2, 3, 4, 5};             // std::array<int, 5>로 추론

std::array의 장점

std::array<int, 5> numbers{10, 20, 30, 40, 50};

// 크기 정보 유지
std::cout << numbers.size() << std::endl;   // 5

// 안전한 접근
try {
    numbers.at(10) = 100;                   // 범위 검사, 예외 발생
} catch (const std::out_of_range& e) {
    std::cout << "인덱스 오류!" << std::endl;
}

// 반복자 지원
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
    std::cout << *it << " ";
}

// 범위 기반 for 루프
for (const auto& num : numbers) {
    std::cout << num << " ";
}

// 다른 std::array와 비교
std::array<int, 5> other{10, 20, 30, 40, 50};
if (numbers == other) {
    std::cout << "같은 배열!" << std::endl;
}

4. 배열 비교표

1. 기본 특성 비교

특성 C 스타일 배열 std::array std::vector
크기 컴파일 타임 고정 컴파일 타임 고정 런타임 가변
메모리 위치 스택 (지역) / 데이터 세그먼트 (전역) 스택 (지역) / 데이터 세그먼트 (전역)
크기 정보 포함 안됨 포함됨 포함됨
STL 호환성 제한적 완전 지원 완전 지원
범위 검사 없음 at() 메서드로 가능 at() 메서드로 가능
성능 최고 최고 약간 오버헤드

2. 선언 및 초기화