[C] 다차원 배열
먼저 배열의 종류에 대해 알아보자.
static배열과 Fixed Dynamic배열은 컴파일 할 때 배열의 최대 범위가 정해지지만, Dynamic배열은 배열의 최대 범위가 계속해서 변할 수 있다. (Java의 ArrayList와 비슷한데, 일단은 ArrayList도 배열이라고 개념적으로 생각하자.)
배열을 관리할 때는 Descriptor를 사용한다.
Descriptor는 배열을 선언한 뒤 선언된 배열을 저장할 때 사용된다고 이해하면 되고, 컴파일 시에 사용된다.
즉, 메모리를 할당하는 코드를 생성하기 위해 Descriptor가 사용되고, 왼쪽 그림과 같은 정보를 지닌다.
컴파일 말고 런타임 과정에서도 Descriptor를 가질 수 있는데, Java를 생각하면 이해하기 쉽다.
Java에서 배열을 다룰 때 indexoutofbound에러를 본 적이 있을 것이다.
정해진 배열의 범위를 넘어가서 값에 접근하려고 할 때 발생하는 에러인데, 이 에러도 Descriptor가 발생시킨다.
반면 C는 런타임 시에 Descriptor가 존재하지 않아 배열 범위를 초과해서 값에 접근해도 오류를 발생시키지 않는다. (C의 Descriptor는 배열의 시작 주소만 가지고 있다고 생각해도 무방하다.)
이런 양상을 통해 C는 실행속도를 중시하고 Java는 안전을 중요시하는 언어임을 알 수 있다.
이제 다차원 배열에 대해 알아보자.
1차원 배열을 저장할 때는 배열의 요소를 쭉 펼쳐서 주소와 값을 대응시키는 방식으로 저장했다.
그럼 2차원 배열은 어떻게 저장할까?
2차원 배열의 저장은 언어마다 조금씩 다르다. C에서 어떻게 저장하는지 알아보자.
C에서 다차원 배열은 정방형 배열만 가능하다고 정의하고 있다.
사실 익숙한 배열 형태이긴 하다. 보통 다차원 배열을 생각하면 위와 같이 생각하니까..
하지만 정방형 배열이 아닌 배열도 있기에 이렇게 정의한다. 이 배열은 다음에 살펴보자.
정방형 배열은 행 우선 방식으로 펼쳐서 저장한다. (위의 그림을 통해 쉽게 어렵지 않게 이해할 수 있다.)
2차원 배열의 요소를 가져올 때는 위와 같이 가져온다. (행 우선 방식이니..)
2차원배열에 대한 연산도 아래와 같이 수행된다.
배열의 이름은 포인터이니.. 이차원 배열에서의 배열 이름도 포인터라고 생각할 수 있다.
그런데 다른 표현도 있을까?
int arr[3][4] 는 int (*ptr) [4]와 동일하다.
주소를 담고 있는 곳으로 가면 4칸짜리 행이 나온다. (배열의 크기가 4인 배열.)
C에서의 2차원배열은 Java와 조금 다르니, C만의 특성을 잘 알아두자.
'Programming Language > C' 카테고리의 다른 글
[C] 이중 포인터 (0) | 2022.05.01 |
---|---|
[C] 다차원 배열 초기화 (0) | 2022.05.01 |
[C] 정리 (1) (0) | 2022.04.18 |
[C] const (0) | 2022.04.13 |
[C] Call By Value (0) | 2022.04.13 |
댓글
이 글 공유하기
다른 글
-
[C] 이중 포인터
[C] 이중 포인터
2022.05.01 -
[C] 다차원 배열 초기화
[C] 다차원 배열 초기화
2022.05.01 -
[C] 정리 (1)
[C] 정리 (1)
2022.04.18 -
[C] const
[C] const
2022.04.13