C++ 에서 함수에 매개변수로 2차원 배열을 어떻게 던져주어야 하는 지에 대해서 다뤄보고자 한다. 사용하다보면 사용상 헷갈려서 정리 차원에서 다루어 본다. 크게 pointer 사용법
, vector 사용법
로 구분이 가능하다.
pointer 배열 방식 사용
정적 배열은 C에서 사용하는 방식과 거의 유사하다. int 배열을 엑세스하기 위해서는 거의 필수적으로 포인터를 넘겨야 한다. 방법은 아래 세 가지 정도가 가장 많이 쓰인다.
2차원의 고정배열을 사용하는 방법
고정된 배열
을 가지고 있다면 가장 편하게 사용할 수 있는 방법이다. 실제 데이터도 정적인 함수 내의 stack만을 사용하는 특징이 있다.- 단점 : 다만
컴파일 타임에서 row, col 각 차원의 크기가 고정
되어 버린다.
1234567891011const int CONST_ROW = 3;const int CONST_COL = 2;void func(int arr[CONST_ROW][CONST_COL]){int val = 0;for (int i = 0; i < CONST_COL; i++)for (int j = 0; j < CONST_COL; j++)arr[i][j] = val++;}int arr[CONST_ROW][CONST_COL];func(arr);고정배열의 포인터를 활용하는 방법
- row의 개수를 고정시켜서 활동하는 방법이다. 실제 데이터는 new를 사용하여 매핑시켜야 하므로
heap 메모리
에 정적으로 쌓인다. row 한 축에 대해서만 컴파일 타임에서 결정되고,col축 데이터는 런타임에서 크기가 결정
된다. - 단점 : delete를 사용하여 추가적인
메모리 누수 방지
를 고려해야 한다.
123456789101112const int CONST_ROW = 3;void func2(int *arr[CONST_ROW], int num_col){int val = 0;for (int i = 0; i < CONST_ROW; i++)for (int j = 0; j < num_col; j++)arr[i][j] = val++;}int *arr[CONST_ROW];for (int i=0; i < CONST_ROW; i++)arr[i] = new int(CONST_COL);func2(arr, CONST_COL);- row의 개수를 고정시켜서 활동하는 방법이다. 실제 데이터는 new를 사용하여 매핑시켜야 하므로
1차원의 배열을 2차원의 배열처럼 활용하는 방법
- 1차원의 배열을 바로 2차원의 배열처럼 매핑시켜서 활용하는 방법이다. 메모리를 잡을 때는 정적, 동적 양쪽 모두 활용하는 것이 가능하다.
- 장점 :
row, col 양 차원 모두에 대해서 런타임에서 크기를 결정
가능하다. - 단점 : 다만 각 데이터에 엑세스할 때
arr[i*num_row + j]
와 같은 식으로 사용해야 하는 점에서 직관적이지 못한 단점이 있다.
12345678910111213void func3(int *arr, int num_row, int num_col){int val = 0;for (int i = 0; i < num_row; i++)for (int j = 0; j < num_col; j++)arr[i*num_row + j] = val++;}int num_col = 3;int num_row = 2;int arr_static[CONST_ROW*CONST_COL];int *arr_dynamic = new int(num_col*num_row);func3(arr_static, CONST_COL);func3(arr_dynamic, CONST_COL);
vector 배열 방식 사용
동적 배열을 가장 간단한 방법은 vector를 사용하는 방법이다. vector< vector<type> >
과 같은 식으로 사용하면 arr[i][j]와 같은 방법으로 쉽게 엑세스가 가능하다. 마찬가지로 3차원, 4차원 배열에도 같은 방식으로 응용이 가능하다. 정적 배열에서 문제가 있었던 컴파일 타임에서 배열 크기가 결정된다거나 엑세스할 때 비직관적인 방법으로 호출을 한다던가 하는 문제가 전혀 없다.
|
|