이번 Chapter에서는 다차원 배열에 들어가면서 행
과 열
에 대해 많이 언급될 예정이다.
행
= 가로
, 열
= 세로
를 기억해주길 바라며...⭐
(나는 손가락으로 십자가를 그리면서 행!열!하고 외웠다 ㅋㅋ)
다차원 배열
이란? 2차원 이상의 배열을 의미한다. (2차원 배열, 3차원 배열 등)
2차원 배열
은 평면구조의 배열이고,
3차원 배열
은 직육면체 구조의 배열이다.
1차원, 2차원, 3차원 배열의 선언형태는 다음과 같다.
int arrOneDim[10]; // 길이가 10인 1차원 int형 배열
int arrTwoDim[5][5]; // 가로, 세로의 길이가 각각 5인 2차원 int형 배열
int arrThreeDim[3][3][3]; // 가로, 세로, 높이의 길이가 각각 3인 3차원 int형 배열
이중 1차원 배열을 가장 많이 사용하고 다차원배열 중에서는 2차원 배열을 가장 많이 사용한다.
int arr1[3][4];
int arr2[2][6];
2차원 배열의 선언방식은 1차원 배열의 선언방식과 매우 유사하다.
다만 그 특성상 세로와 가로의 길이를 각각 명시하는 형태를 띨 뿐이다.
따라서 위와 같이 배열을 선언하면 다음과 같은 형태로 배열이 생성(할당)된다.
![]() | ![]() |
---|---|
int arr1[3][4] | int arr2[2][6] |
- 2차원 배열의 선언 방식
: TYPE arr[세로길이][가로길이];
#include <stdio.h>
int main()
{
int arr1[3][4];
int arr2[7][9];
printf("세로3, 가로4: %d \n", sizeof(arr1));
printf("세로7, 가로9: %d \n", sizeof(arr2));
return 0;
}
> 출력
세로3, 가로4: 48 = 3x4x4
세로7, 가로9: 252 = 7x9x4
다음 배열의 선인되어 모든 배열의 요소가 0으로 초기화 되었다고 가정하자.
int arr[3][3];
arr[0][0]=1;
이 문장이 실행되면서
인덱스 값 세로 0, 가로 0 위치에 접근하여 1이 삽입된다.
arr[0][1]=2;
arr[2][1]=5;
위 두 문장으로 인해 세로 0, 가로 1인 위치와 세로 2, 가로 1인 위치에 각각 2와 5가 삽입된다.
![]() | ![]() |
---|---|
arr[0][1]=2 | arr[2][1]=5 |
따라서 선언을 할 때는 원하는 갯수의 칸 만큼([N][M]) 선언하고,
해당 칸은 0부터 세기 때문에 원하는 위치의 칸은 1을 빼서 ([N-1][M-1])을 값을 저장하거나 변경하면 된다.
#include <stdio.h>
int main()
{
int villa[4][2];
int popu, i, j;
// 가구별 거주인원 입력 받기
for (i = 0; i < 4; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d층 %d호 인구수: ", i + 1, j + 1);
scanf("%d", &villa[i][j]);
}
}
// 빌라의 층별 인구수 출력하기
for (i = 0; i < 4; i++)
{
popu = 0;
popu += villa[i][0];
popu += villa[i][1];
printf("%d층 인구수: %d \n", i + 1, popu);
}
return 0;
}
> 출력
1층 1호 인구수: 2
1층 2호 인구수: 4
2층 1호 인구수: 3
2층 2호 인구수: 5
3층 1호 인구수: 2
3층 2호 인구수: 6
4층 1호 인구수: 4
4층 2호 인구수: 3
1층 인구수: 6
2층 인구수: 8
3층 인구수: 8
4층 인구수: 7
메모리의 구조는 1차원적 구조이다.
2차원 배열의 메모리 구조는 어떨까?
2차원 배열도 메모리상에는 1차원의 형태로 존재한다.
#include <stdio.h>
int main()
{
int arr[3][2];
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
printf("%p \n", &arr[i][j]);
return 0;
}
> 출력
00000052A1EFFC68
00000052A1EFFC6C
00000052A1EFFC70
00000052A1EFFC74
00000052A1EFFC78
00000052A1EFFC7C
배열요소 별 주소 값은 int형 변수의 크기인 4바이트만큼만 차이가 나게 나열되어 저장되었다.
1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화가 가능하다.
2차원 배열의 가장 일반적인 초기화 방법은 다음과 같다.
초기화 리스트 안에는 행 단위로 초기화할 값들을 별도의 중괄호로 명시해야한다.
일부의 요소에 대해서는 초기화를 생략할 수도 있다.
비게 되는 공간은 0으로 초기화된다.
중괄호 없이도 초기화가 가능하다.
부족한 영역은 0으로 초기화 되고 아래와 같이 한줄로 표현 가능하며 같은 초기화 내용이다.
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7};
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 0, 0};
#include <stdio.h>
int main()
{
int i, j;
// 2차원 배열 초기화 예시 1
int arr1[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9,}
};
// 2차원 배열 초기화 예시 2
int arr2[3][3] = {
{1},
{4,5},
{7,8,9}
};
// 2차원 배열 초기화 예시 3
int arr3[3][3] = { 1,2,3,4,5,6,7 };
for (i = 0; i < 3; i++)
{
for(j=0;j<3;j++)
printf("%d ", arr1[i][j]);
printf("\n");
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d ", arr2[i][j]);
printf("\n");
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d ", arr3[i][j]);
printf("\n");
}
return 0;
}
> 출력
1 2 3
4 5 6
7 8 9
1 0 0
4 5 0
7 8 9
1 2 3
4 5 6
7 0 0
1차원 배열선언 시, 초기화 리스트가 존재한다면, 배열의 길이를 명시하지 않아도 된다.
2차원 배열시에는 세로와 가로 길이가 따로 있기 때문에 완전하게 알려주지 않고는 배열이 어렵지만,
세로 또는 가로의 길이를 알려주면 배열의 길이를 완전히 알려주지 않고도 선언과 동시에 초기화 할 수 있다.
우선 3차원 배열의 크기를 sizeof 연산의 결과를 통해 확인해보자. 그럼 3차원 배열이 직육면체와 같은 형태라는 것을 알 수 있을 것이다.
#include <stdio.h>
int main()
{
int arr1[2][3][4];
double arr2[5][5][5];
printf("높이2, 세로3, 가로4 int형 배열: %d \n", sizeof(arr1));
printf("높이5, 세로5, 가로5 double형 배열: %d \n", sizeof(arr2));
return 0;
}
> 출력
높이2, 세로3, 가로4 int형 배열: 96 = 2x3x4x4
높이5, 세로5, 가로5 double형 배열: 1000 = 5x5x5x4
높이 정보의 반영을 제외하면 3차원 배열의 선언 및 접근방법은 2차원 배열의 선언과 접근방법과 동일하다.
다음 예제를 통해 3차원 배열의 선언과 접근에 대해 알아보자.
#include <stdio.h>
int main()
{
int mean = 0, i, j;
int record[3][3][2] = {
{
{70, 80}, // A 학급 학생 1의 성적
{94, 90}, // A 학급 학생 2의 성적
{70, 85}, // A 학급 학생 3의 성적
},
{
{83, 90}, // B 학급 학생 1의 성적
{95, 60}, // B 학급 학생 2의 성적
{90, 82}, // B 학급 학생 3의 성적
},
{
{98, 89}, // C 학급 학생 1의 성적
{99, 94}, // C 학급 학생 2의 성적
{91, 87} // C 학급 학생 3의 성적
}
};
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
mean += record[0][i][j];
printf("A 학급 전체 평균: %g \n", (double)mean / 6);
mean = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
mean += record[1][i][j];
printf("B 학급 전체 평균: %g \n", (double)mean / 6);
mean = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
mean += record[2][i][j];
printf("C 학급 전체 평균: %g \n", (double)mean / 6);
return 0;
}
> 출력
A 학급 전체 평균: 81.5
B 학급 전체 평균: 83.3333
C 학급 전체 평균: 93
각 반별 학생수는 3명이고 학급의 수가 3개이다. 국어와 수학 점수를 입력했다.
3차원 배열은 여러 개의 2차원 배열이 모여있는 형태로 이해하는 것이 좋다.
<Review>
드디어 다차원 배열에 들어갔다.
아직까지는 이해하는데 큰 무리가 없었다.
최근 10일동안 게시물 업로드가 없었던 이유는...
부트캠프를 통해 교육을 받은 넥스트러너스 오즈코딩스쿨에서 조교 제안이 와서 면접을 보고 합격하였다...!
조교를 지난주 월요일(8/19)부터 일하다가 어제(8/27)부로 일한지 일주일 만에 퇴사하게 되었다...⭐
그 이유는 나중에 후기 시리즈로 업로드할 예정이다...
나의 커리어에 더 나은 미래가 함께하길...!
오늘은 계속해서 많은 chapter를 나갈 것이다.
함께 따라와 주시길~!