C++에서 배열(array)은 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조입니다. C++에는 여러 종류의 배열이 있으며, 각각의 특징과 사용법을 자세히 설명해드리겠습니다.
// 선언과 동시에 크기 지정
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차원 배열 선언과 초기화
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)
int cube[2][3][4]; // 3차원 배열
cube[0][1][2] = 42; // 접근
// 초기화
int tensor[2][2][2] = {
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
};
#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<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;
}
특성 | C 스타일 배열 | std::array | std::vector |
---|---|---|---|
크기 | 컴파일 타임 고정 | 컴파일 타임 고정 | 런타임 가변 |
메모리 위치 | 스택 (지역) / 데이터 세그먼트 (전역) | 스택 (지역) / 데이터 세그먼트 (전역) | 힙 |
크기 정보 | 포함 안됨 | 포함됨 | 포함됨 |
STL 호환성 | 제한적 | 완전 지원 | 완전 지원 |
범위 검사 | 없음 | at() 메서드로 가능 | at() 메서드로 가능 |
성능 | 최고 | 최고 | 약간 오버헤드 |