Study/C언어

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 21 [다차원배열1 - 다차원배열의 기본(2차원, 3차원)]

2018. 10. 17. 17:30

 제 21강) 다차원배열1 - 다차원배열의 기본

오늘은 다차원배열의 첫 시간으로 다차원배열의 기본에 대해서 알아봅니다.

다차원배열은 2차원 이상의 배열을 다차원이라고 합니다.

 

 1) 다차원 배열이란

일반적인 배열은

이렇게 1차원적인 배열을 뜻합니다.

(가로로만, 혹은 세로로만, x로만)

 

여기서 더 나아가서 다차원배열은

1차원을 넘어서는 배열을 뜻합니다.

(가로와 세로, x와 y)

위의 배열은 대표적인 2차원배열입니다.

세로로3, 가로로7인 배열이죠.

 

 2) 2차원배열

가장 많이 쓰이는 배열은 1차원배열입니다.

그리고 그 다음으로 쓰이는 배열은 2차원배열입니다.

즉, int arr[3][2]로 선언된 2차원배열은 [0][0], [0][1], [1][0], [1][1], [2][0], [2][1] 총 3x2 2차원배열이 생성됩니다.

(배열의 번호는 0부터)

 

자료형 배열이름[세로길이][가로길이];
// 혹은
자료형 배열이름[세로길이][가로길이] = { 초기화값 };
 
// 예)
int arr3x3[3][3];
int arr3x2[3][2] = { 1, 2, 3, 4, 5, 6 };
int arr4x2[4][2] = { { 1, 2 } , { 3, 4 }, { 5, 6 }, { 7, 8 } };

배열은 위와 같이 선언 및 사용합니다.

 

여기서 7번줄과 8번줄을 보면 초기화하는 방법이 다른것처럼 보이지만

int arr3x2[3][2] = { 1, 2, 3, 4, 5, 6 };
↓↓↓↓
int arr3x2[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

7번줄의 선언은 사실상 8번줄의 선언과 같은 구분하여 초기화하는 것과 같은 뜻입니다.

(하지만 아래에서 반례를 보여드리겠습니다.)

 

int arr[3] = { 1 };
→ arr[0] = 1, arr[1] = 0, arr[2] = 0

우리가 1차원배열을 선언했을 때 선언된 공간보다 적게 초기화를 하면 나머지 공간의 값들은 0으로 초기화 됩니다.

2차원배열의 경우에도 같습니다.

int arr[3][2] = { 1, 2, 3 };
→ arr[0][0] = 1, arr[0][1] = 2
→ arr[1][0] = 3, arr[1][1] = 0
→ arr[2][0] = 0, arr[2][1] = 0

이렇게 순차적으로 값을 넣고 나머지 빈 구역에는 0으로 초기화를 시킵니다.

 

그런데 다음과 같이 선언되어 있다면

int arr[3][3] = { {1}, {2}, {3} };

어떻게 될까요?

방금 전에 본 2차원배열과 같이 봅시다.

int arr[3][2] = { 1, 2, 3 };
→ arr[0][0] = 1, arr[0][1] = 2
→ arr[1][0] = 3, arr[1][1] = 0
→ arr[2][0] = 0, arr[2][1] = 0
 
int arr[3][2] = { {1}, {2}, {3} };
→ arr[0][0] = 1, arr[0][1] = 0
→ arr[1][0] = 2, arr[1][1] = 0
→ arr[2][0] = 3, arr[2][1] = 0

사뭇 다른 결과를 보여줍니다.

1번줄의 선언에서는 행구분 없이 값을 초기화시켰기 때문에 차례대로 [0][0] ~ [2][1]에 값을 넣지만

6번줄의 선언에서는 행구분 있이(중괄호 안의 또 다른 중괄호) 값을 초기화시켰기 때문에 첫번째 열에만 값을 넣고 나머지 열에는 값이 없기때문에 0으로 초기화 합니다.

int arr[5][2] = { {1}, {2}, {3} };
→ arr[0][0] = 1, arr[0][1] = 0
→ arr[1][0] = 2, arr[1][1] = 0
→ arr[2][0] = 3, arr[2][1] = 0
→ arr[3][0] = 0, arr[2][1] = 0
→ arr[4][0] = 0, arr[2][1] = 0

그럼 위의 배열도 이해되시겠죠?

 

이제 2차원배열을 출력하는 예제를 봅시다.

#include <stdio.h>
 
int main()
{
    int a[3][3] = { 1, 2, 3 };
    int b[3][3] = { {1}, {2}, {3} };
    
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            // a[0][0] ~ a[2][2] 까지 반복하며 출력
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    
    printf("\n");
    
    for(int i = 0; i < 3; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            // b[0][0] ~ b[2][2] 까지 반복하며 출력
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    return 0;
}

2차원배열은 위와같이 for문을 2개 겹쳐서 출력합니다.

보통 바깥의 for문은 행을, 안쪽의 for문은 열을 반복하도록 합니다.

 

 

 3) 3차원배열

3차원 배열은 2차원을 넘어서는 배열입니다.

위와 같이 2차원배열이 더 겹치는 즉, 가로 세로에 높이까지 있다고 보시면 됩니다.

(6면체라고 생각하면 됩니다. x, y, z)

int arr[2][3][3] = { 
    { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },            // arr[0][][] 라인
    { { 11, 22, 33 }, { 44, 55, 66 }, { 77, 88, 99 } }    // arr[1][][] 라인
}

2차원배열처럼 선언하지만 거기에 차원이 하나 더 붙어서 선언하시면됩니다.

 

#include <stdio.h>
 
int main()
{
    int arr[2][3][3] = { 
        { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
        { { 11, 22, 33 }, { 44, 55, 66 }, { 77, 88, 99 } }
    };
    
    for(int i = 0; i < 2; i++)
    {
        printf("arr[%d][][]\n", i);
        for(int j = 0; j < 3; j++)
        {
            // a[0][0] ~ a[2][2] 까지 반복하며 출력
            for(int k = 0; k < 3; k++)
            {
                printf("%d ", arr[i][j][k]);
            }
            printf("\n");
        }
        printf("\n\n");
    }
    return 0;
}

3차원배열을 출력하거나 사용할 때는 보통 for문을 3개를 씁니다.

 

3차원은 사실상 많이 안쓰입니다.

(쓴다고 한다면 게임에서 많이 쓰입니다.)

많이 써봐야 2차원에서 대부분은 해결이 가능하고 나중에 배울 "구조체"를 사용하기 때문에 1차원으로도 많이 해결됩니다.

 

 다음 시간에는

오늘은 다차원배열의 기본에 대해서 알아보았습니다.

위에서 소개한 3차원 이외에도 4차원 이상의 개념도 있지만 사실상 3차원도 잘 안씁니다.

하지만 2차원까지는 잘 알아두셔야 합니다.

 

다음 시간에는 이 다차원 배열에 포인터를 접목시켜보겠습니다.

 

저작자표시 비영리 변경금지 (새창열림)

'Study > C언어' 카테고리의 다른 글

처음하시는 분들을 위한 C언어 기초강의 시즌2 - 23 [메모리 구조와 메모리 할당, 배열 동적할당(malloc, realloc, calloc, free)]  (0) 2018.10.28
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 22 [다차원배열2 - 다차원배열과 포인터, 이중 포인터, 다중 포인터]  (0) 2018.10.17
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 20 [함수 포인터]  (0) 2018.10.17
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 19 [문자열]  (0) 2018.10.17
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 18 [배열과 포인터]  (0) 2018.10.17
'Study/C언어' 카테고리의 다른 글
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 23 [메모리 구조와 메모리 할당, 배열 동적할당(malloc, realloc, calloc, free)]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 22 [다차원배열2 - 다차원배열과 포인터, 이중 포인터, 다중 포인터]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 20 [함수 포인터]
  • 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 19 [문자열]
Eskeptor
Eskeptor
Eskeptor
Hello World
Eskeptor
전체
오늘
어제
  • 분류 전체보기 (138)
    • Computer (5)
      • Linux (1)
      • Hardware (2)
      • Software (0)
      • Tips (1)
      • Website (0)
    • Mobile (1)
      • Application (1)
    • Study (108)
      • Android (9)
      • C언어 (45)
      • C++ (17)
      • Unity 5(유니티5) (11)
      • Qt 프로그래밍 (2)
      • MFC (12)
      • C#, Winform (12)
    • My World (24)
      • OpenPad(Android) (12)
      • 한글 패치 (1)
      • C#으로 만든 귀요미들 (5)
      • MFC로 만든 귀요미들 (6)
    • Life Goes On (0)
      • Hip Hop (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • Tetris
  • 자료구조
  • 비행기
  • 초보
  • Java
  • C#
  • 슈팅게임
  • 유니티
  • C++
  • 프로그래밍
  • 배열
  • 메모장
  • 자바
  • c++11
  • 강좌
  • 강의
  • 기본
  • 오픈패드
  • 왕초보
  • MFC
  • openpad
  • 알고리즘
  • 안드로이드
  • 만들기
  • C언어
  • Unity
  • 기초
  • Android
  • 포인터
  • 테트리스

최근 댓글

최근 글

hELLO · Designed By 정상우.
Eskeptor
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 21 [다차원배열1 - 다차원배열의 기본(2차원, 3차원)]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.