C++에서 배열을 선언하는 방법은 여러 가지가 있으며, 일반 배열, 동적 배열, 이중 배열(2차원 배열) 등을 사용할 수 있다.
1️⃣ 기본 배열 (정적 배열)
정적 배열은 크기가 고정된 배열로, 컴파일 시 크기가 결정된다.
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5}; // 크기가 5인 배열 선언
std::cout << "첫 번째 원소: " << arr[0] << std::endl;
return 0;
}
📌 특징
- 크기가 고정됨 (컴파일 시 결정)
- 초기화 시 배열 크기 자동 설정 가능: int arr[] = {1, 2, 3};
✅ 배열 초기화 방법
배열을 초기화하는 방법에는 여러 가지가 있다.
int arr1[5] = {1, 2, 3, 4, 5}; // 전체 초기화
int arr2[5] = {1, 2}; // 나머지는 자동으로 0으로 채움
int arr3[] = {10, 20, 30}; // 크기를 자동으로 설정
int arr4[5] = {}; // 모든 요소를 0으로 초기화
✅ 배열 요소 접근
배열 요소는 인덱스(index) 를 사용하여 접근한다. (0부터 시작)
#include <iostream>
int main() {
int arr[3] = {10, 20, 30};
std::cout << "첫 번째 원소: " << arr[0] << std::endl;
std::cout << "두 번째 원소: " << arr[1] << std::endl;
return 0;
}
📌 주의
배열의 크기를 초과하여 접근하면 예기치 않은 동작(버퍼 오버플로우, 런타임 오류) 가 발생할 수 있다.
✅ 반복문을 사용한 배열 출력
#include <iostream>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
for (int i = 0; i < 5; i++) {
std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
}
return 0;
}
📌 특징
- for문을 사용해 배열을 쉽게 순회 가능
- sizeof(arr) / sizeof(arr[0]) 을 사용하여 배열 크기 계산 가능
2️⃣ 이중 배열 (2차원 배열)
2차원 배열은 행(row)과 열(column)로 구성된 배열이다.
#include <iostream>
int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
std::cout << "첫 번째 행, 첫 번째 원소: " << matrix[0][0] << std::endl;
return 0;
}
📌 특징
- int arr[행][열]; 형식으로 선언
- matrix[i][j] 로 요소에 접근
✅ 이중 배열(2차원 배열) 초기화
1. 기본 선언 및 초기화
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
2. 중괄호를 생략하는 초기화
int arr[2][3] = {1, 2, 3, 4, 5, 6};
- 왼쪽에서 오른쪽, 위에서 아래 방향으로 자동 채워짐
- 위 코드와 동일하게 동작
3. 특정 원소만 초기화 (나머지는 자동 0으로 채움)
int arr[2][3] = {{1, 2}, {4}};
📌 결과
arr[0][0] = 1 arr[0][1] = 2 arr[0][2] = 0
arr[1][0] = 4 arr[1][1] = 0 arr[1][2] = 0
- `{1, 2}`만 제공했으므로 `arr[0][2]`는 자동 `0`으로 초기화
- `{4}`만 제공했으므로 `arr[1][1]`, `arr[1][2]`도 `0`으로 초기화
4. 모든 원소를 0으로 초기화
int arr[3][3] = {}; // 모든 원소가 0으로 초기화
📌 결과
arr[0][0] = 0 arr[0][1] = 0 arr[0][2] = 0
arr[1][0] = 0 arr[1][1] = 0 arr[1][2] = 0
arr[2][0] = 0 arr[2][1] = 0 arr[2][2] = 0
- `{}`을 사용하면 모든 값이 자동으로 0 으로 설정됨
- `int arr[3][3] = {0};` 와 동일
✅ 이중 배열(2차원 배열) 출력
#include <iostream>
int main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
📌 출력 결과
1 2 3
4 5 6
7 8 9
3️⃣ 가변 크기 배열(동적 배열)
C++에서는 크기가 고정된 배열 대신 동적 배열(new 연산자) 을 사용할 수도 있다.
✅ 1차원 동적 배열
#include <iostream>
int main() {
int size;
std::cout << "배열 크기를 입력하세요: ";
std::cin >> size;
int* arr = new int[size]; // 동적 배열 할당
for (int i = 0; i < size; i++) {
arr[i] = i + 1;
std::cout << arr[i] << " ";
}
delete[] arr; // 동적 메모리 해제
return 0;
}
✅ 2차원 동적 배열
#include <iostream>
int main() {
int rows = 3, cols = 3;
// 2차원 동적 배열 생성
int** matrix = new int*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new int[cols];
}
// 값 할당 및 출력
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j + 1;
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
// 동적 메모리 해제
for (int i = 0; i < rows; i++) {
delete[] matrix[i];
}
delete[] matrix;
return 0;
}
📌 특징
- `new`를 사용해 동적 할당
- 사용 후 반드시 `delete[]` 로 메모리 해제
4️⃣ ` std::array`를 사용한 배열 (C++11 이상)
C++11부터 제공되는 `std::array`는 정적 크기 배열을 보다 안전하고 편리하게 사용할 수 있도록 도와준다.
기존 C 스타일 배열 (`int arr[5];`) 과 비교했을 때, 유지보수성과 기능성이 향상된 배열 컨테이너이다.
`std::array`는 C++ 표준 라이브러리의 컨테이너 클래스로,
✔️ 정적 크기 배열을 감싸서 더 안전하고 직관적인 기능을 제공한다.
#include <array>
✔️ `std::array`는 템플릿 기반이며, 다음과 같이 선언된다.
std::array<자료형, 크기> 변수명;
✔️ 주요 장점
- C 스타일 배열보다 안전 (std::array는 크기 정보를 저장하므로 size() 사용 가능)
- STL과 호환 가능 (begin(), end() 같은 STL iterator 사용 가능)
- at() 함수로 범위 검사 가능 (안전한 인덱스 접근)
- std::vector보다 가벼움 (동적 크기 변경이 필요 없다면 std::array가 std::vector보다 빠름)
✅ 1차원 배열 기본 선언
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.size(); i++) {
std::cout << "arr[" << i << "] = " << arr[i] << std::endl;
}
return 0;
}
- `arr.size()` : 배열의 크기를 반환
✅ 1차원 배열 초기화 방법
1. 기본 초기화 (명시적 값 설정)
std::array<int, 5> arr = {1, 2, 3, 4, 5};
2. 기본값으로 0 초기화
std::array<int, 5> arr = {}; // 모든 값이 0으로 초기화
- `{}`를 사용하면 자동으로 `0`으로 채워짐
3. `.fill(value)` 사용
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr;
arr.fill(10); // 모든 요소를 10으로 설정
for (int num : arr) {
std::cout << num << " ";
}
return 0;
}
- 배열의 모든 요소를 `value` 값으로 초기화 할 수 있음
✅ 2차원 배열 선언
#include <iostream>
#include <array>
int main() {
std::array<std::array<int, 3>, 2> matrix = {
{ {1, 2, 3}, {4, 5, 6} }
};
std::cout << "matrix[0][1]: " << matrix[0][1] << std::endl;
return 0;
}
- `std::array<std::array<int, 열>, 행>` 형식
- 중괄호 `{}`를 사용하여 행과 열을 초기화
✅ 2차원 배열 초기화
(1) 직접 초기화
std::array<std::array<int, 3>, 2> matrix = {
{ {1, 2, 3}, {4, 5, 6} }
};
(2) `{}`를 사용하여 모든 원소를 0으로 초기화
std::array<std::array<int, 3>, 2> matrix = {}; // 모든 요소가 0으로 초기화
✅ 2차원 배열 반복문 출력
#include <iostream>
#include <array>
int main() {
std::array<std::array<int, 3>, 3> matrix = {
{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }
};
for (const auto& row : matrix) { // 행 반복
for (int num : row) { // 열 반복
std::cout << num << " ";
}
std::cout << std::endl;
}
return 0;
}
📌 출력 결과
1 2 3
4 5 6
7 8 9
✅ std::array 주요 함수
함수 | 설명 |
`.size()` | 배열의 크기 반환 |
`.fill(value)` | 모든 요소를 `value`로 채움 |
`.at(index)` | 안전한 인덱스 접근 (배열 범위 벗어나면 예외 발생) |
`.front()` | 첫 번째 요소 반환 |
`.back()` | 마지막 요소 반환 |
`.begin()`, `.end()` | STL 반복자 지원 (순회 가능) |
`.data()` | 내부 배열 포인터 변환 |
💡 `constexpr`을 사용한 크기 자동 계산
배열 크기를 자동으로 계산하려면 constexpr을 사용한다.
#include <iostream>
int main() {
constexpr int ROWS = 2, COLS = 3;
int arr[ROWS][COLS] = { {1, 2, 3}, {4, 5, 6} };
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
std::cout << arr[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
📌 특징
- constexpr을 사용해 매크로처럼 크기 정의
- 크기를 변경할 때 유지보수성이 증가
'C++' 카테고리의 다른 글
[C++] 사용자 입력 받기 (0) | 2025.02.05 |
---|