저번 시간에 배열에 관하여 배워보았습니다. 배열은 많은 변수들을 저장하기 위해서 만들어 졌다고 했죠 그럼 혹시 배열의 배열을 만들어 보자라는 생각을 한 사람이 있을까요? 네 오늘은 바로 배열의 배열 2차원 배열을 배워보도록 하겠습니다.
2차원 배열은 마치 우리가 하나의 사각형모양의 저장공간이라고 생각할 수도 있습니다.
바로 위와 같은 모양의 저장공간으로 생각할 수 있겠습니다. 물론 "생각"을 말입니다!!! 아직 이 상자만 보면 어떤 의미인지 이해가 안될 수도 있기 때문에 우리가 int arr[2][4]을 선언했다고 예를 치면 밑처럼 데이터들이 있다고 "생각"을 하는 겁니다.
어떤가요? 이렇게 보니 2차원배열이 나름 쓸만한 녀석이라고 생각이 들지 않나요? 이런 모습이 마치 2D게임에서의 맵을 표현한 것 같기도 하고 지도를 표현할 수 있을 것 같기도 하고 하지 않나요? 실제로 여러분들이 이번수업을 배우고 아니면 나중에 자료구조라는 수업을 배우고는 반드시 2차원배열을 사용하여 게임이나 지도를 만드시게 될겁니다.
그럼 실제로 코드를 작성해서 2차원배열을 사용해볼까요
#include<stdio.h>
int main(){
int arr[2][4] = {1,2,3,4,5,6,7,8};
// int arr[2][4] = {1,2,3,4
// 5,6,7,8}; 이렇게 적으셔도 전혀 문제가 없습니다.
printf("1행 3열의 데이터 값 : %d\n", arr[0][2]);
printf("2행 1열의 데이터 값 : %d\n", arr[1][0]);
return 0;
}
위 처럼 작성하면 1행 3열의 데이터값으로 3이 출력되고 2행 1열의 데이터 값으로는 5가 출력됩니다.
위에서 '생각'이라고 계속해서 따옴표로 생각을 강조했는데 그 이유는 오로지 저 상자의 모양은 이해를 돕기 위해서 그린 가상 공간입니다. 우리가 사용하는 메모리의 공간은 절대로 저런 박스 형식으로 배열의 변수들을 저장하지 않습니다. 물론 연속해서 저장을 하겠지만 저런 박스 혹은 표와 같은 식으로 저장을 하지는 않습니다.
사실은 위와 같은 식으로 메모리에 배열의 변수값들이 저장됩니다.
우리가 배열을 공부할 때 배열을 선언할 때의 다양한 상황들을 살펴보았는데 2차원 배열도 이에 대해서 얘기보도록 하겠습니다.
int arr[] = {1, 2, 3, 4};
저번 글에 잊고 언급을 안하고 넘어간 부분이 있는데 위와 같이 배열을 선언할때 배열의 크기를 선언하지 않으면 컴파일러는 이를 어떻게 생각할까요? 이는 컴파일러가 스스로 배열안의 값을 보고 배열의 크기를 자동으로 4라고 정의를 해줍니다. 하지만 배열안 변수의 값을 입력하지 않고 배열의 크기를 알려주지 않으면 당연히 오류가 나겠죠.
그럼 2차원배열은 어떨까요??
int arr[][2] = {1, 2, 3, 4}
위와 같이 첫번째 크기 값을 적지 안았을때는 컴파일러가 뒤의 배열크기를 보고 변수들을 보고 판단하여 앞의 배열크기 값을 2로 설정합니다. 1차원배열의 상황가 비슷하죠?
int arr[][2] = {1, 2, 3, 4, 5};
그럼 이번에도 컴파일러가 자동으로 판단을 할 수 있을까요? 왜냐하면 두번째 배열의 크기가 2인데 2개씩 숫자를 묶으면 5만 남게되기 때문입니다. 이때 컴파일러는 0을 추가로 집어넣어 크기를 맞춥니다. 그럼으로 배열의 데이터는 {1 , 2 , 3, 4, 5, 0} 이 되면서 첫번째 빈 배열의 크기는 3이 들어가게 되죠.
int [3][] = {1, 2, 3, 4, 5, 6};
마지막으로 이런 상황은 어떻게 처리가 될까요? 안타깝게도 이런 상황에서는 컴파일러오류가 생깁니다. 첫번째 배열의 크기를 안다고 해도 두번째 배열의 크기를 모르면 항상 오류가 발생하게됩니다.
그럼 오늘은 2차원배열에 관해서 배워보았습니다. 사실 2차원배열을 알고 있으면 3차원배열, 4차원배열, .... n차원배열까지 여러분은 이와 같은 방식으로 사용할 수 있을 겁니다. (사실 그렇게 쓸일도 없지만...) 2차원배열을 응용하다보면 헷갈리는 부분이 상당히 있겠지만 이도 조금만 생각을 하면 금방 해결하실 수 있을 거라 믿습니다. 그럼 여러분들 이해가 가시지 않는 부분은 꼭 댓글로 남겨주시길 바라겠습니다.
'C언어' 카테고리의 다른 글
야메 C언어 강좌: 12. 문자열 (0) | 2022.10.24 |
---|---|
야메 C언어 강좌: 11. 포인터(1) (0) | 2022.01.14 |
야메 C언어 강좌: 9. 배열 (0) | 2020.07.26 |
야메 C언어 강좌: 8. switch문 (6) | 2020.05.02 |
야메 C언어 강좌: 7. while문과 for문 (2) | 2020.04.29 |
댓글