다차원 배열
다차원 배열의 개념
다차원 배열은 배열의 요소가 다시 배열인 구조를 말합니다.
가장 흔한 형태는 2차원 배열이며, 행렬(matrix)과 같은 데이터를 표현하는 데 사용됩니다.
3차원 이상의 배열도 가능하지만, 실제로는 2차원 배열이 가장 많이 사용됩니다.
2차원 배열의 선언과 초기화
2차원 배열 선언
int matrix[3][4]; // 3행 4열의 정수형 2차원 배열
이 선언은 3개의 행과 4개의 열을 가진 2차원 정수 배열을 생성합니다.
2차원 배열 초기화
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
이 방식으로 2차원 배열을 선언과 동시에 초기화할 수 있습니다.
부분 초기화
int matrix[3][4] = {{1, 2}, {3}, {4, 5, 6}};
초기화되지 않은 요소들은 자동으로 0으로 초기화됩니다.
2차원 배열 요소 접근
2차원 배열의 요소에 접근할 때는 두 개의 인덱스를 사용합니다.
#include <iostream>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int value = matrix[1][2]; // 2행 3열의 요소에 접근 (값: 7)
std::cout << "matrix[1][2] = " << value << std::endl;
matrix[0][3] = 100; // 1행 4열의 요소 값 변경
std::cout << "matrix[0][3] = " << matrix[0][3] << std::endl;
return 0;
}
2차원 배열과 메모리
2차원 배열은 실제로는 1차원 메모리에 연속적으로 저장됩니다.
이를 이해하는 것은 배열의 효율적인 사용과 최적화에 중요합니다.
#include <iostream>
int main() {
int matrix[3][4];
std::cout << "배열의 크기: " << sizeof(matrix) << " bytes" << std::endl;
std::cout << "첫 번째 요소의 주소: " << &matrix[0][0] << std::endl;
std::cout << "두 번째 행의 첫 번째 요소 주소: " << &matrix[1][0] << std::endl;
return 0;
}
이 예제를 통해 2차원 배열이 메모리에 어떻게 저장되는지 확인할 수 있습니다.
2차원 배열과 반복문
2차원 배열의 모든 요소에 접근하려면 중첩된 반복문을 사용합니다.
#include <iostream>
int main() {
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
return 0;
}
범위 기반 for 루프와 2차원 배열
C++ 11부터는 범위 기반 for 루프를 사용하여 2차원 배열을 더 쉽게 순회할 수 있습니다.
#include <iostream>
int main() {
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
for (auto& row : matrix) {
for (int elem : row) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
return 0;
}
다차원 배열
C++에서는 2차원 이상의 다차원 배열도 선언할 수 있습니다.
int cube[2][3][4]; // 3차원 배열
이는 2개의 3x4 2차원 배열을 가진 3차원 배열을 선언합니다.
다차원 배열의 매개변수 전달
함수에 다차원 배열을 전달할 때는 첫 번째 차원을 제외한 나머지 차원의 크기를 명시해야 합니다.
#include <iostream>
void printMatrix(int matrix[][4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
std::cout << matrix[i][j] << " ";
}
std::cout << std::endl;
}
}
int main() {
int matrix[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
printMatrix(matrix, 3);
return 0;
}
std::array와 다차원 배열
C++ 11 이상에서는 std::array를 사용하여 다차원 배열을 더 안전하고 편리하게 다룰 수 있습니다.
#include <iostream>
#include <array>
int main() {
std::array<std::array<int, 4>, 3> matrix = {{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}};
for (const auto& row : matrix) {
for (int elem : row) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
return 0;
}
동적 다차원 배열
동적으로 크기가 결정되는 다차원 배열은 포인터의 배열 또는 벡터의 벡터를 사용하여 구현할 수 있습니다.
#include <iostream>
#include <vector>
int main() {
int rows = 3, cols = 4;
std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));
// 행렬 초기화
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j + 1;
}
}
// 행렬 출력
for (const auto& row : matrix) {
for (int elem : row) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
return 0;
}
연습 문제
- 3x3 행렬을 입력받아 전치행렬(transpose)을 출력하는 프로그램을 작성하세요.
- 두 개의 2차원 배열(행렬)을 입력받아 행렬 곱셈을 수행하는 프로그램을 구현하세요.
- N x N 크기의 2차원 배열을 입력받아 시계 방향으로 90도 회전시키는 프로그램을 작성하세요.
참고자료
- C++ 공식 문서의 다차원 배열 섹션 : C++ Multidimensional Arrays
- 동적 다차원 배열 할당 기법 : Dynamic multidimensional arrays in C++
- C++ Core Guidelines의 다차원 배열 관련 규칙 : ES.28: Use lambdas for complex initialization, especially of const variables
- Effective C++ : 항목 13 "자원 관리에는 객체가 그만!" - Scott Meyers (다차원 배열과 자원 관리의 관계)