C++에서 2차원 배열을 특정 값으로 초기화하는 방법은 사용하는 배열의 종류에 따라 다릅니다. 순수 C-스타일 배열, STL std::array
, 그리고 std::vector
각각에 대한 방법을 알려드릴게요.
순수 C-스타일 2차원 배열은 가장 기본적인 형태입니다. 특정 값으로 초기화하려면 몇 가지 방법이 있습니다.
선언과 동시에 0으로 초기화:C++
전체 배열을 0으로 초기화하는 가장 간단한 방법입니다.
int arr[3][4] = {}; // 모든 요소를 0으로 초기화
반복문을 사용한 초기화:C++
특정 값으로 초기화할 때 가장 일반적인 방법입니다.
int arr[3][4];
int value = 5;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
arr[i][j] = value;
}
}
std::fill 또는 memset 사용:C++
std::fill은 모든 타입에 대해 사용할 수 있는 범용적인 방법입니다. memset는 char 또는 byte 단위로 메모리를 채우기 때문에 0 또는 -1과 같은 특정 값으로만 초기화할 때 안전하게 사용할 수 있습니다.
#**include** <algorithm> // std::fill 사용#**include** <cstring> // memset 사용int arr[3][4];
// std::fill 사용 (5로 초기화)
std::fill(&arr[0][0], &arr[0][0] + 3 * 4, 5);
// memset 사용 (0으로 초기화)
memset(arr, 0, sizeof(arr));
// memset 사용 (-1로 초기화)
memset(arr, -1, sizeof(arr));
⚠️ 주의: memset
는 바이트 단위로 값을 채우므로, int
타입의 배열을 0
이나 -1
이 아닌 다른 값(예: 5
)으로 초기화하면 예상치 못한 결과가 발생합니다. 예를 들어, memset(arr, 5, sizeof(arr));
는 각 바이트를 5로 채워 int
값인 5가 아니라 0x05050505
와 같은 값을 만듭니다.
std::array
를 사용한 2차원 배열 초기화std::array
는 런타임이 아닌 컴파일 타임에 크기가 정해지는 배열이며, STL 컨테이너로서의 이점을 가집니다.
선언과 동시에 초기화:C++
std::array는 std::fill 멤버 함수를 제공합니다.
#**include** <array>std::array<std::array<int, 4>, 3> arr;
// 모든 요소를 5로 초기화
for (auto& row : arr) {
row.fill(5);
}
선언과 동시에 0으로 초기화:C++
빈 중괄호 {}를 사용하면 모든 요소를 0으로 초기화할 수 있습니다.
std::array<std::array<int, 4>, 3> arr = {}; // 모든 요소를 0으로 초기화
std::vector
를 사용한 2차원 배열 초기화std::vector
는 동적으로 크기를 조절할 수 있는 배열입니다. 2차원 std::vector
는 "벡터의 벡터" 형태로 구현됩니다.
생성자 초기화:C++
std::vector의 생성자를 활용하여 모든 요소를 특정 값으로 초기화할 수 있습니다.
#**include** <vector>int rows = 3;
int cols = 4;
int value = 5;
// 행(rows)을 3개 생성하고, 각 행을 4개의 5로 채워진 벡터로 초기화합니다.
std::vector<std::vector<int>> vec(rows, std::vector<int>(cols, value));
이 방법은 가장 권장되는 방법이며, 코드가 간결하고 의도가 명확합니다.
반복문을 사용한 초기화:C++
벡터를 먼저 생성한 후, 반복문을 통해 값을 할당할 수도 있습니다.
std::vector<std::vector<int>> vec(3, std::vector<int>(4)); // 3x4 벡터 생성 (0으로 초기화)
int value = 5;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 4; ++j) {
vec[i][j] = value;
}
}
배열 종류 | 0으로 초기화 | 특정 값으로 초기화 |
---|---|---|
순수 C-스타일 배열 | int arr[3][4] = {}; |
for 루프 또는 std::fill |
std::array |
std::array<...> arr = {}; |
for 루프 또는 std::array::fill 멤버 함수 |
std::vector |
std::vector<...>(rows, std::vector<...>(cols)); |
std::vector<...>(rows, std::vector<...>(cols, value)); |
std::vector
를 사용하는 경우, 생성자 초기화가 가장 직관적이고 효율적인 방법입니다. 순수 배열의 경우, memset
은 0 또는 -1 초기화에만 안전하게 사용하고, 그 외에는 std::fill
이나 반복문을 사용하는 것이 좋습니다.