Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

다차원 배열 본문

프로그래밍 언어/C언어

다차원 배열

세레프 2023. 2. 17. 03:50

 배열이란 변수를 묶어놓은 저장공간으로, 1차원 배열과 다차원 배열이 있다. 배열은 모든 요소가 같은 자료형을 가지며, 요소가 연속적으로 나열되어 있으며, 메모리에 물리적으로도 연결되어 있다. 그래서 변수와 달리 배열은 요소의 숫자로 저장공간을 불러 올 수 있기 때문에 반복문에 사용하기 좋다.

 

배열

컴퓨터는 데이터의 값을 저장하기 위해선 메모리에 변수를 선언해서 변수에 값을 저장한다. 그런데 이러한 변수도 데이터를 1개만 저장을 할 수 있다. 하지만 우리는 많은 데이터값을 다루기 때

my-it-diary.tistory.com

 

 다차원 배열

 다차원 배열에는 배열을 요소로 가진 배열로, 비슷한 데이터 값들을 구별해서 저장할 때 주로 사용된다. 종류로는 평면적(행,열)으로 저장하는 2차원 배열과 입체적(행,열,면)으로 저장하는 3차원 배열이 있다. 

 2차원 배열배열의 각 요소가 1차원 배열인 배열로, 1차원의 배열이 쌓여서 만들어지는 배열이라고 생각하면 좋다. 

자료형 배열명 [요소 행개수] [요수 열개수];

 위의 구조는 2차원 배열의 구조로, 배열이 행과 열로 구성되어 있는것을 볼 수 있다.

 변수의 값을 부를 때에는 행, 열을 이용해 부르며, 요소가 있는 행을 찾은 뒤, 그 행에서 열을 확인하면서 값을 찾는다.

 int[ j ][ i ]를 통해 2차원의 변수를 확인해 보자

  1열 2열 3열 ... i열
1행 a[0][0] a[0][1]  a[0][2]   a[0][i-1]
2행 a[1][0]  a[1][1]  a[1][2]    a[1][i-1] 
3행 a[2][0] a[2][1]  a[2][2]    a[2][i-1] 
...          
j행 a[j-1][0] a[j-1][1]  a[j-1][2]    a[j-1][i-1]

 이때, 요소 행번호와 열번호가 "i-1","j-1"인것을 볼 수 있다. 이는 번호가 "0"부터 시작해서 나타나는 현상이다. 

 

 위의 표현처럼 2차원 배열은 행과 열을 통해 요소를 구별한다. 하지만 컴퓨터의 메모리는 평면적인 형태가 아닌 선형적인 형태이기에 실제로는 한 행의 변수의 끝부분과 다음 행의 변수의 첫부분이 이어지도록 생성이 된다.

자료형 배열명[ j ][ i ]={

    {값0,값1,....,값i-1}, // 1행
    {값0,값1,....,값i-1}, // 2행
...
    {값0,값1,....,값i-1} // j행

};
자료형 배열명[ j ][ i ]={

    값00,값01,....,값0i-1,
    값10,값11,....,값1i-1,
...
    값j-10,값j-11,....,값j-1i-1

};

 위의 구조는 2차원 배열을 초기화하는 구조로, 1번 형식은 중괄호 안에 1차원 배열들을 만들고 쉼표를 통해 행을 구분하는 형식이며, 2번 형식은 1차원 배열을 초기화하는 방식처럼 값을 한 줄로 나열하여 대입하는 형식이다.

 

 만약 배열을 초기화 하지 않고 사용 할려는 경우, 각 요소에 일일히 값을 대입하여 저장해야 한다.

#include<stdio.h>

void main() {
	int temp[2][3] = {
		{10,20,30},
		{40,50,60}
	};
	printf("%4d,%4d,%4d\n", temp[0][0], temp[0][1], temp[0][2]);
	printf("%4d,%4d,%4d\n", temp[1][0], temp[1][1], temp[1][2]);

	printf("sizeof(배열전체):%d\n", sizeof(temp));
	printf("sizeof(배열한행):%d\n", sizeof(temp[0]));
}

 위의 소스코드는 2차원 배열을 초기화를 통해 만드는 코드이며, 결과를 보면 배열한행에 12byte를 가지고 있으며, 배열 전체는 24byte를 가진 것을 확인 할 수 있다. 이는 배열"temp"에 1차원 배열 2개가 요소로 존재한다는 뜻이다. 즉, 2차원 배열은 1차원 배열을 요소로 구성해서 만들어 진다는 것을 알 수 있다.

 

 3차원 배열2차원 배열을 요소로 만든 배열로, 2차원 배열을 겹쳐서 만드는 배열이라고 생각하면 좋다.

자료형 배열명[요소 면갯수][요소 행갯수][요소 열갯수] ;

 위의 구조는 3차원 배열의 구조로, 배열 구성에 면, 행, 열이 있는 것을 볼 수 있다.

 요소를 부를 때에는 행, 열, 면을 이용해 부르며, 요소가 있는 면을 먼저 찾은 뒤에, 그 면에서 위치해 있는 행과 열을 찾는다. 쉽게 비유하자면, 엑셀에서 값을 찾을 때, sheet의 위치를 확인하고 필요한 행을 추린 다음,  그 sheet에서 행에서 열을 확인하는 식으로 진행되는 것과 같다.

 

 int[ k ][ j ][ i ]를 통해 3차원 배열의 변수를 확인해 보자

1면 1열 2열 3열 ... i열
1행 a[0][0][0] a[0][0][1] a[0][0][2]   a[0][0][i-1]
2행 a[0][1][0] a[0][1][1] a[0][1][2]   a[0][1][i-1]
3행 a[0][2][0] a[0][2][1]  a[0][2][2]   a[0][2][i-1]
...          
j행 a[0][j-1][0] a[0][j-1][1] a[0][j-1][2]   a[0][j-1][i-1]
2면 1열 2열 3열 ... i열
1행 a[1][0][0] a[1][0][1] a[1][0][2]   a[1][0][i-1]
2행 a[1][1][0] a[1][1][1] a[1][1][2]    a[1][1][i-1] 
3행 a[1][2][0] a[1][2][1] a[1][2][2]    a[1][2][i-1] 
...          
j행 a[1][j-1][0] a[1][j-1][1] a[1][j-1][2]    a[1][j-1][i-1] 

k면 1열 2열 3열 ... i열
1행 a[k-1][0][0] a[k-1][0][1]  a[k-1][0][2]    a[k-1][0][i-1] 
2행 a[k-1][1][0] a[k-1][1][1] a[k-1][1][2]    a[k-1][1][i-1] 
3행 a[k-1][2][0]  a[k-1][2][1] a[k-1][2][2]   a[k-1][2][i-1] 
...          
j행 a[k-1][j-1][0] a[k-1][j-1][1] a[k-1][j-1][2]    a[k-1][j-1][i-1] 

 2차원 배열과 마찬가지로 3차원배열 또한 행, 열, 면을 통해 요소를 구별한다. 하지만 컴퓨터의 메모리는 입체적적인 형태가 아닌 선형적인 형태로 배열을 만들기 때문에, 실제로는 한 행의 변수의 끝부분과 다음 행의 변수의 첫부분이 연결되어 있는 형태를 갖는다.

 

 3차원 배열도 초기화를 할 수 있으며, 2가지 초기화 방법이 있다.

자료형 배열명[k][j][i];={
{
    {값0,값1,....,값i-1} //1행
    {값0,값1,....,값i-1} //2행
    ...
    {값0,값1,....,값i-1} //j행
},//1면
{
    {값0,값1,....,값i-1} //1행
    {값0,값1,....,값i-1} //2행
    ...
    {값0,값1,....,값i-1} //j행
},//2면
...
{
    {값0,값1,....,값i-1} //1행
    {값0,값1,....,값i-1} //2행
    ...
    {값0,값1,....,값i-1} //j행
} //k면
};
자료형 배열명[ k ][ j ][ i ]={

    값000,값001,....,값00i-1,
    값010,값011,....,값01i-1,
    ...
    값0j0,값0j-11,....,값0j-1i-1,
    ...
    값100,값101,....,값10i-1,
    값110,값111,....,값11i-1,
    ...
    값1j-10,값1j-11,....,값1j-1i-1
    ...
    값k-100,값k-101,....,값k-10i-1,
    값k-110,값k-111,....,값k-11i-1,
    ...
    값k-1j-10,값k-1j-11,....,값k-1j-1i-1

};

 1번 형식은 중괄호 안에 2차원 배열들을 만들고 쉼표를 통해 면을 구분하는 형식이며, 2번 형식은 1차원 배열을 초기화하는 방식처럼 값을 한 줄로 나열하여 저장하는 형식이다. 

#include<stdio.h>

void main() {
	int temp[2][2][2] = {
		{
			{1,2},
			{3,4}
		},//1면
		{
			{5,6},
			{7,8}
		}//2면
	};
	for (int k = 0; k < 2; k++) {
		printf("%d번째 면\n", k+1);
		printf("%4d%4d\n", temp[k][0][0],temp[k][1][1]);
		printf("%4d%4d\n", temp[k][1][0], temp[k][1][1]);
		}
	printf("sizeof(배열전체):%d\n", sizeof(temp));
	printf("sizeof(1면전체):% d\n", sizeof(temp[0]));
	printf("sizeof(1행전체):% d\n", sizeof(temp[0][0]));
}

 위의 소스코드는 3차원 배열을 초기화를 통해 만드는 코드이며, 결과를 보면 배열 한면에 16byte를 가지고 있으며, 배열 한행에 8byte를 가지고, 배열 전체는 32byte를 가진 것을 확인 할 수 있다. 이는 배열"temp"에 2차원 배열 2개가 요소로 존재하며, 2차원 배열에 2개의 1차원 배열이 있다는 뜻이다. 즉, 3차원 배열은 2차원 배열을 요소로 구성해서 만들어 진다는 것을 알 수 있다.

'프로그래밍 언어 > C언어' 카테고리의 다른 글

포인터 연산  (0) 2023.02.19
포인터의 기본  (0) 2023.02.18
배열  (0) 2023.02.16
함수와 변수  (0) 2023.02.15
함수  (0) 2023.02.14
Comments