배울 것들/언어

C프로그래밍 9/? 배열

cobrizo 2018. 11. 20. 22:28

1차원 배열

단순하게 배열은 '둘 이상의 변수를 모아 놓은 것'으로 설명할 수 있습니다.


int oneDimArr[4]


int               배열을 이루는 요소(변수)의 자료형

oneDimArr    배열의 이름

[4]               배열의 길이

즉, int형 변수 4개로 이뤄진 배열을 선언하되, 그 배열의 이름은 oneDimArr로 한다는 의미입니다. 선언된 배열은 [ ] 연산자 사이에 배열의 위치정보를 명시해 특정 위치에 원하는 값을 저장할 수 있습니다. 이때 들어가는 숫자를 '인덱스'라 합니다. 이는 1부터 시작이 아닌 0부터 시작합니다. 그러면 배열의 선언과 초기화 방법을 확인해보겠습니다.


int arr1[5] = {1, 2, 3, 4, 5};          // 수나적으로 1, 2, ,3, 4, 5로 초기화 한다.

int arr2[ ] = {1, 2, 3, 4, 5, 6, 7};    // 컴파일러에 의해서 자동으로 인덱스에 7이 삽입된다.

int arr3[5] = {1, 2};                   // 3, 4, 5번째 배열요소는 0으로 채워진다.


이러한 방법으로 선언과 동시에 초기화를 진행합니다.

배열을 이용해 문자열 변수의 표현도 가능합니다.


char str[ ] = "Good morning!";    // 배열의 길이는 14로 결정된다.


자세히보면 공백을 포함해도 배열의 길이는 13인데 14로 저장됩니다. 이는 문자열 끝에 '\0'이라는 특수문자가 자동으로 삽입이 되어 실제 문자열의 길이는 14가 되는 겁니다. 따라서 문자열의 저장을 목적으로 char형 배열을 선언할 경우 '\0'이 저장될 공간까지 고려해 배열의 길이를 결정해야 합니다.

이렇듯 문자열의 끝에 자동으로 삽입되는 문자 '\0'을 가리켜 '널(null)'문자라 합니다. 이 널 문자는 C언에서 표현하는 모든 문자열의 끝에 자동으로 삽입됩니다. 따라서, 널문자의 유무로 문자 배열인지 문자열인지를 구분할 수 있습니다.

그러면 널 문자는 왜 필요한지 생각해보겠습니다. 메모리상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않아 구분이 불가능합니다. 그래서 널 문자를 이용해서 문자열의 끝을 표시하는 것입니다.


다차원 배열

다차원 배열은 2차원 이상의 배열을 의미합니다. 즉 2차원, 3차원 배열을 총칭해서 다차원 배열이라 합니다.


int arrOneDim[10];            // 길이가 10인 1차원 int형 배열

int arrTwoDim[5][5];          // 가로, 세로의 길이가 각각 5인 2차원 int형 배열

int arrThreeDim[3][3][3];     // 가로, 세로, 높이의 길이가 각각 3인 3차원 int형 배열


이중 가장 많이 사용하는 2차원 배열을 중심으로 진행하겠습니다. 2차원 배열이 선언되면 다음의 형태로 배열이 생성(할당)됩니다.

 

1열 

2열 

3열 

4열 

5열 

1행 

[0][0] 

[0][1] 

[0][2] 

[0][3] 

[0][4] 

2행 

[1][0] 

[1][1] 

[1][2] 

[1][3] 

[1][4] 

3행 

[2][0] 

[2][1] 

[2][2] 

[2][3] 

[2][4] 

4행 

[3][0] 

[3][1] 

[3][2] 

[3][3] 

[3][4] 

5행 

[4][0] 

[4][1] 

[4][2] 

[4][3] 

[4][4] 


그렇다면 2차원 배열의 선언과 초기화를 보겠습니다.


int arr1[3][3] = {

{1},            // 1 0 0

{4, 5},         // 4 5 0

{7, 8, 9}      // 7 8 9

  };

이와같이 중괄호를 넣어주면 일부 빠진 요소에 대해서는 초기화를 생략할 수 있습니다.


int arr2[3][3] = {

1, 2, 3,

4, 5, 6,

7

};

int arr3[3][3] = {1, 2, 3, 4, 5, 7};

이처럼 진행하면 마지막에 입력한 배열 뒤에 값은 자동으로 초기화가 진행됩니다.


int arr4[ ][4] = {1, 2, 3, 4, 5, 6, 7, 8};

배열의 크기를 알려주지 않을 경우 1차원과 달리 가로또는 세로의 길이는 지정해야합니다. 그렇지 않다면 arr4의 크기가 1x8인지 2x4인지 알수가 없어 에러가 발생합니다.


3차원 배열의 경우 잘 사용하지않고, 2차원가 큰 차이가 없어 생략하겠습니다. 3차원 배열은 큐빅퍼즐이라 생각하면 쉽습니다.