본문 바로가기

C Language/Programming Course

6장 배열(3부 다차원 배열) 첫번째 시간

6장 배열

3부 다차원 배열 

 

이번시간은  다차원 배열에 대해서 설명을 드리겠습니다.
다차원 배열은 저번시간에 배운 1차원 배열에서 더 어렵다고 하기보다는
조금 복잡하다고 생각하시면 됩니다.
하지만 이 복잡한 부분도 전체적인 부분을 보게 된다면 1차원 배열과 별반 차이가
없다고 느껴질 것입니다. 

다차원 배열 중에서 2차와 3차 배열만 여기서 다루도록 하겠습니다.
보통 2,3차원 정도 배열만 알고 있으면 그 이후 4,5,6... 등 배열은 쉽게 이해를
할 수 있으며, 그리고 그렇게 사용도 잘 안되어 2, 3차원만 다루도록 하겠습니다.

2차원 배열의 설명은 저번 1차원 배열을 설명을 할 때 
나온 예인 아파트로 설명을 드리도록 하겠습니다.

 401호  402호  403호  404호
 301호  302호  303호   304호 
 201호  202호  203호   204호 
 101호  102호  103호   104호


이 아파트를 보시면 1차원 배열을 배운 시간에는 하나의 층으로만 이야기 했을 것입니다. 
그럼 자연스럽게 2차원 배열에서는 하나의 층이 아닌 이 아파트 하나를 이야기 한다는 
것을 대충이나마 느낄 수 있을 것입니다. 

그럼 이 1층부터 4층 까지를 저번 시간에 배운 1차원 배열로 하여
나타내어 보겠습니다. 

================================
int _1_floor[4];
int _2_floor[4];
int _3_floor[4];
int _4_floor[4];
================================

이렇게 나타 낼 수 있겠죠!?
근데~ 이 1차원 배열도 1층만 있을 때는 정리가 되는 것처럼 보였지만
4층까지 다 나타내니 앞서 했던 변수처럼 보이게 될 것입니다. 
주소체계로 이야기 한다면 _1_floor,  _2_floor, _3_floor, _4_floor 각 주소가
연속 되질 않고 순서 없이 저장이 되겠죠.

우리가 프로그래밍 할 때는 주소체계는 필요 없을 것입니다.
눈에 보이질 않으니..
하지만 같은 역할을 하는 것을 저렇게 따로 두는 건 보기 좋지 않겠죠!?

즉, 하나의 층의 각 방을 따로 나타내는 것보다 하나의 층 안에 나타내는 것이 낫고
그리고 층 끼리 따로 나타내는 것보다 하나의 아파트에 층을 나타내는 것이
낫겠다는 이야기 입니다.

그래서 2차원 배열이 사용이 됩니다.
아파트로 말하면 층을 모은 하나의 아파트 전체를 이야기 하는 거죠.

그럼 표현은 방법을 보게 되면 1차원 배열 표현에서 [] 이 괄호만 하나 더 넣어 주면 되는 것입니다.

================================
int apartment[4][4];
================================

자세히 보면 [4][4] 이렇게 두개가 있습니다. 여기에서 앞의 대괄호는 층을 나타는 것이며,
뒤의 대괄호는 각 방을 나타내는 것입니다.

예로 5층 건물에 각 층에 방이 10개 있다.
이말을 변수로 나타내면

 apartment[5][10] 이렇게 나타 낼 수 있는 것입니다.

그럼 이 2차원 배열에서 1층에 값을 넣어 보겠습니다.

================================
int apartment[4][4];

apartment[0][0] = 1;
apartment[0][1] = 2;
apartment[0][2] = 3;
apartment[0][3] = 4;
================================

이런 식으로 변수를 넣으면 됩니다.
1차원 배열과 같은 방법입니다.

자 그럼 아파트로 예를 들어 보았는데, 확실한 이해를 돕기 위해
다른 예를 하나 더 들어 보겠습니다.
학생 성적에 대해서 이야기 해 보겠습니다.
1년동안 성적표를 생각해 보겠습니다.

성적표에는 간단하게 국어, 영어, 수학, 사회, 과학이 있습니다.
보통 1학기 중간, 기말 2학기 중간 기말 이렇게 4번 시험을 치죠!?
그럼 국어 성적이 4개가 존재 합니다.

그럼 여기에서 그냥 변수를 나타내게 된다면 즉, 성적표에 다 나오는 것이 아니라
하나의 성적표에 하나의 성적이 나오게 된다면,
1학기 중간 국어 성적표
1학기 기말 국어 성적표
2학기 중간 국어 성적표
2학기 기말 국어 성적표
.
.
.
.
이렇게 성적표가 많아 지겠죠!?
그럼 이 성적 국어 성적들은 국어 성적표에 수학은 수학 성적표에 이런식으로 나타 낸다면
국어 성적표
영어 성적표
수학 성적표
사회 성적표
과학 성적표
이렇게 성적표가 나오겠죠!?
근데 이 성적표도 많죠?

그래서 전체 성적표에 국어, 영어, 수학, 사회, 과학 성적을 모두 나타내서
하나의 성적표를 나타내 주죠?

그럼 이를 언어적으로 생각하면 처음에 각 학기의 성적을 따로 준다는 것은
변수만으로 구성한다는 것이고
각 과목의 성적표를 준다는 것은 1차원 배열을 사용한다는 것
그리고 하나의 성적표를 준다는 것은 2차원 배열을 사용한다는 것

이겠죠!?
그래서 개발자들은 조금 더 변수 사용을 쉽게 하기 위해 2차원 배열을 사용하게 되는 것입니다.
하나의 배열 변수 선언하면 거기에 학생하나의 성적을 다 넣어서
찾기도 쉬우니깐 이렇게 사용을 하는 것입니다.

그럼 이제 3차원 배열에 대해서 설명을 해 보겠습니다.
이 3차원 배열도 2차원 배열의 예를 그대로 사용하겠습니다.
아파트의 2차원 배열은

================================
int apartment[4][4];
================================

이렇게 사용한다고 했습니다.
하지만 보통 아파트 한개가 존재하는 것이 아니라 
예로 우방 3차 아파트를 보게 된다면, 101동 아파트 102동 아파트 이런식으로
여러 아파트가 모여 하나의 우방 3차가 되게 됩니다.
즉, 2차원 배열도 모여 있을 수도 있다는 거죠!?

두번째 예인 성적표를 학생 개개인으로 생각하면 2차원 배열이면 충분하겠지만
선생님 입장에서는 각 학생의 성적을 하나의 용지에 다 볼수 있으면 좋겠죠!?

이런 예들이 3차원 배열이 될 수 있는 것입니다.

아파트로 101동 아파트, 102동 아파트, 103동 아파트를 변수로 나타내 보겠습니다.
================================
int _101_apartment[4][4];
int _102_apartment[4][4];
int _103_apartment[4][4];
================================

이렇게 나타 낼 수 있겠죠!?
하지만 앞서 이야기 한 것처럼 이 각 2차원 배열인 아파트는 모이면 우방 3차가
될 수 있습니다.
그렇다면 이렇게 2차원 배열보다 우방 3차 라고 하나로 나타내면 더욱 사용하기가
쉽겠죠!?
이를 나타내 보면,

================================
int woo_bang_3_apartment[3][4][4];
================================

이렇게 나타나게 됩니다.
즉, 이 3차원 배열도 1차에서 2차로 변할 때 처럼 [] 괄호가 하나더 늘어 나는 것입니다.
그럼
우방 3차의 101동 아파트 1층의 각방에 값을 넣어 보도록 하겠습니다.

================================
int woo_bang_3_apartment[3][4][4];

int woo_bang_3_apartment[0][0][0] = 1;
int woo_bang_3_apartment[0][0][1] = 2;
int woo_bang_3_apartment[0][0][2] = 3;
int woo_bang_3_apartment[0][0][3] = 4;
================================

이렇게 나타내면 됩니다.

2차원 배열과 다를게 없죠!?

4차원 배열 5차원 배열도 이런식으로 []만 추가 하여 사용할 수 있습니다.
다만 잘 사용은 안 될 것입니다.

그럼 이번시간에는 이것으로 마치고 다음시간에 다차원 배열의 주소체계를
설명을 드리도록 하겠습니다.