OneDev

[C] 17. 배열(Array)(2) - 고차원 배열(2차원 배열, 3차원 배열,...) 본문

Language/C

[C] 17. 배열(Array)(2) - 고차원 배열(2차원 배열, 3차원 배열,...)

one_dev 2022. 7. 26. 21:31

지난 포스팅에서는 배열의 기본적인 것들에 대해 알아보았다.

이번 시간에는 2차원 배열을 포함한 고차원 배열에 대해 알아보자.

 

1. 2차원 배열이란?

2차원 배열은  배열을 원소로 갖는 배열 이라 생각하면 될듯하다.

("배열의 배열" 이라 생각하면 이해가 쉬울듯하다)

 

2차원 배열을 정의하는 방법은 다음과 같다.

(배열의 타입) (배열 이름) [a][b]  // a, b 는 배열의 크기(정수형)

이를 다음과 같이 이해하면 어떨까 싶다 :

a : 2차원 배열 원소의 갯수는 a 개 이다

b : 각 원소는 b개의 원소로 이루어진 배열

// (예시)
int arr[3][2] ;
// 이 배열은 총 3개의 원소로 이루어져 있는데, 이 세개의 원소는 각각 2개의 원소를 가진 1차원 배열이다

이를 그림으로 나타내보면 다음과 같다.

arr[0][0] arr[0][1]
arr[1][0] arr[1][1]
arr[2][0] arr[2][1]

2차원 배열 arr[3][2] 의 첫 번째 원소 : { arr[0][0], arr[0][1] }

2차원 배열 arr[3][2] 의 두 번째 원소 : { arr[1][0], arr[1][1] }

2차원 배열 arr[3][2] 의 세 번째 원소 : { arr[2][0], arr[2][1] }

 

이를 한 눈에 알아보기 쉽게 요약하자면 다음과 같다

출처 : 모두의 코드 블로그

 

선형대수학을 아는 사람이라면, 다차원 배열이(일차원 배열도 포함해서) 행렬과 매우 유사하게 생겼다는 느낌을 받을 것이다.

다음의 예를 보자.

int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};  // 이 배열은 1차원 배열? 2차원 배열?

분명 arr[3][3] 은 이차원 배열인데 {1, 2, 3, ..., 9} 와 같이 한 줄로 정의해줘도 되는 것일까?

 

사실 일차원 배열이던 이차원 배열이던 메모리 상에는 데이터가 일렬로 나열되어있다(메모리는 항상 1차원이다).

arr[0][0] / arr[0][1] / arr[0][2] / arr[1][0] / .......... / arr[2][2]

와 같은 식으로말이다.

하지만 이 이차원 배열을 각 원소들이 2차원 공간 상에 배치되어 있다고 생각해도 무방하다.

중요한 것은, 배열의 원소에 접근할 때 일차원 배열은 한 개의 인덱스로, 이차원 배열은 두 개의 인덱스로 접근한다는 것이다(3차원은 세개, 4차원은 네개.....).

 

2. 2차원 배열 정의

 

2차원 배열을 정의할 때 개인 성향에 따라 약간씩 스타일에 변형을 줄 수 있다.

예를 들자면, 아래의 두 배열은 표현만 다를 뿐 같은 배열이다.

int arr[2][3] = {1, 2, 3, 4, 5, 6};
int arr[2][3] = {{1,2,3},{4,5,6}};

 

또한,  아래의 두 배열 또한 같은 배열이다.

int arr[4] = {1, 2, 3, 4}
int arr[] = {1, 2, 3, 4}; // 배열의 size 를 따로 명시하지 않았다

컴파일러가 우리가 정의한 배열 {1, 2, 3 , 4} 를 보고 자동으로 대괄호 [ ] 안에 4를 넣은셈 치고 생각했다 보면 된다.

(컴파일러가 임의로 배열의 크기를 정한 것은 아니다)

 

※ 하지만 다음과 같은 정의는 할 수 없다.

 

(1) 일차원 배열의 size 를 명시하지 않는 경우

int arr[];  // 이런 선언은 불가능 !

왜냐하면, 배열의 크기는 임의로 정해질 수 없기 때문이다.

위와 같이 정의한다면 컴파일러는 우리가 어떤 크기의 배열을 정의하고 싶은지 알 길이 없는 것이다.

 

(2) 다차원 배열에서 첫 번째 인덱스를 제외한 나머지의 크기들을 지정해주지 않는경우

int arr[2][] = {{4,5,6}, {7,8,9}}; // 불가능 !

C 에서는 다차원 배열의 경우 맨 앞의 크기를 제외한 나머지 크기들을 정확히 지정해줘야 오류가 나지 않는다 !

 

반면 첫 번쨰 크기는 따로 명시해주지 않아도 오류가 나지 않는다

int arr[][2] = {{1,2}, {3,4}, {5,6}, {7}};   // 이건 가능!
// 이 경우 마지막 8번째 원소가 들어갈 자리는 비워놓게 된다

 

3. 다차원 배열(2차원, 3차원, 4차원, ....)

다차원 배열의 기본적인 형태는 다음과 같다

(배열의 형) (배열 이름) [x][y][z].... ;

 

arr3[x][y][z];  // 3차원 배열
arr4[a][b][c][d] // 4차원 배열
arr5[e][f][g][h][i] // 5차원 배열
...
...

일반적으로 3차원 배열까지는 직관적인 이해가 가능하다.

 

1차원 배열은 데이터가 주르륵 나열된 형태이고,

2차원 배열은 행렬처럼 생각하면 되고,

3차원 배열은 좌표 공간처럼 생각하면 된다(행렬을 쌓아올린 직육면체느낌) (혹은 큐브?)

 

이렇듯 3차원 배열까지는 배열의 대략적인 구조를 머릿속으로 그리는게 어렵지 않지만, 

4차원 배열부터는 일상적으로 잘 사용하지 않는 개념이기 때문에 직관적인 이해가 힘들다.

 

4차원 배열 이상부터는 (사실 모든차원의 배열이) 다음의 사실을 이용하면 훨씬 이해하기 수월해진다.

" n 차원 배열은 n 개의 index 를 통해 원소에 접근한다 "

 

위의 예에서 4차원 배열은 a, b, c, d 네 개의 값을 통해 원소에 접근하는 것이 가능하고,

5차원 배열은 e, f, g, h, i 다섯 개의 값을 통해 원소에 접근하는 것이 가능한 것이다.

 

'Language > C' 카테고리의 다른 글

[C] puts : 문자열 출력 함수  (0) 2022.08.02
[C] 18. 포인터(pointer)  (0) 2022.07.27
[C] 16. 배열(Array) (1)  (0) 2022.07.25
[C] 15. 조건문 -switch 문  (0) 2022.07.23
[C] 14. 반복문 탈출 - break / continue  (0) 2022.07.23
Comments