C언어가 아니더라도 대부분의 프로그래밍 언어에서는 "배열"을 지원합니다. 그만큼 중요한 개념이며 많이 쓰이는 개념 중 하나입니다. 배열에 대한 구체적인 이해는 프로그래밍 언어에 대한 이해도를 한층 높여주며, 배열 자료구조는 프로그래머로서 반드시 확실하게 습득하고 넘어가야 합니다. 지금부터 C언어를 활용한 "배열"에 대해서 알아보도록 하겠습니다.
배열(Array)
배열의 정의
배열은 짧게 말해 "같은 자료형의 변수들로 이루어진 집합"입니다. 배열을 선언하는 방법은 간단합니다. 변수를 선언하는 것과 비슷합니다. 다른 점이라면 [ ] 기호를 이용하여 저장 공간의 크기를 명시한다는 것입니다 . 이때, 저장 공간의 크기를 명시할 때는 반드시 "숫자 상수"여야 합니다.
int student[20]; // int형 변수를 20개 선언한 것과 같습니다.
배열의 요소에 접근하기
student[20]이 변수를 20개를 선언한 것과 같다면 student 배열 안의 각각의 요소에 접근하고 싶으면 어떻게 해야할까요?
바로 변수의 이름에 [ ]를 적고 그 안에 자신이 사용하고 싶은 요소의 색인(index)를 명시하면 됩니다. 이때, 색인은 0부터 시작하여 1부터 증가합니다.
만약 student 배열의 4번째 요소에 접근하고 싶다면? student[3]이 될 것입니다.
student[3] // index는 0부터 시작하기에 4번째 요소의 index는 3이 될 것입니다.
배열 초기화하기
변수를 초기화하는 것처럼, 배열 또한 각 요소에 일정한 값을 대입하여 초기화해야합니다. 그렇지 않으면 더미값(쓰레기값)이 들어가게 됩니다. 일반적으로 배열을 초기화할 때 초기값으로 0을 사용합니다.
int arr[3] = {0, 0, 0}; // 이러한 방식으로 배열을 초기화합니다.
그런데 배열의 크기가 커진다면, 초기화하는 것도 굉장히 불편해질 것입니다. 당장 배열의 크기가 20이 되어도 {0, 0, 0, ... ,0 } 굉장히 귀찮아질 것입니다. 그래서 C언어에서는 좋은 방법을 마련해주었습니다.
int arr[100] = {0,}; // 100개의 요소가 모두 0으로 초기화됩니다.
{ } 안에 다음과 같이 적어주면 쉼표 뒤의 모든 값이 0으로 초기화됩니다. 이 방식을 사용하면 매우 편하게 배열을 초기화할 수 있습니다. 배열을 선언할 때 [ ] 안의 요소 개수를 생략할 수도 있습니다.
int arr[] = {1, 2, 1, 2, 1, 2, 1};
이 경우 { } 안에 나열된 항목이 7개 이므로 7개의 저장 공간이 만들어집니다. 그러나 이 방식에는 주의해야 할 것이 있습니다. 바로 초기화에 사용하는 요소 개수가 정확하게 명시되어야 한다는 것입니다. 그렇지 않다면 바로 컴파일러는 에러를 내뿜을 것입니다.
배열의 요소 값을 사용하기
앞에서 배열의 요소 값에 접근하는 것을 알아보았습니다. 이렇게 접근한 요소 값은 읽어올 수도 있고 요소 값끼리 연산도 가능하며 아주 무궁무진하게 사용할 수 있습니다.
int arr[3]; // 배열 선언
arr[0] = 1; // arr 배열의 0번째 요소에 1 대입
arr[1] = arr[0] + 4; // arr 배열의 1번째 요소에 arr[0] 값에 4를 더한 값 대입
arr[2] = arr[1] - arr[0]; // arr 배열의 2번쨰 요소에 arr[1] 값에 arr[0]을 뺀 값 대입
배열과 문자열
C언어에서 문자열을 저장할 때는 'char'형을 사용합니다. 그러나 1바이트 변수이기에 하나의 문자밖에 저장할 수 없습니다. 짧은 문장이라면 일일이 char형을 선언하여 문장을 출력할 수 있으나, 문장의 길이가 길어진다면 기존의 이 방식은 매우 불편합니다. 이때 배열을 사용한다면 명쾌하게 이 상황을 헤쳐나갈 수 있습니다.
배열을 통해 문자열 만들기
문자를 저장하기 위해서는 char형을 써야합니다. 그렇기에 문자열을 저장하기 위해서는 'char 배열'을 사용합니다. 이때, 문자열을 저장할 때, 입력하는 문자의 끝에 NULL 문자 0 (또는 '\0')을 추가로 입력합니다.
char eng[6] = {'h', 'e', 'l', 'l', 'o', 0}; // 문자 개수는 5개이나 끝에 0이 들어가므로 배열 크기는 6
이렇게 직접 다 표현하는 것은 귀찮기에 다음과 같이 간단하게 표현도 할 수 있습니다.
char eng[6] = "Hello"; // 자동으로 끝에 NULL문자 0이 포함됩니다.
문자열 길이 구하기
문자열의 길이를 구하기 위해서는 for문을 이용하여 코드를 짜면 됩니다. 문자열의 길이를 구하는 코드는 다음과 같습니다.
// ############################## 1번째 방법 ##############################
#include <stdio.h>
int GetStringLength(char data[]) {
int count = 0;
while (eng[count] != 0) { // eng의 요소 값이 NULL문자 0이면 while문을 탈출합니다.
count++ // 문자열이 끝이 아니라면 문자 개수를 하나 증가시킵니다.
}
}
int main() {
int data_length; // 문자열 길이 저장할 변수
char data[10] = "Happy";
data_length = GetStringLength(data);
printf("문자열의 길이는 %d입니다.\n", data_length);
return 0;
}
// ############################## 2번째 방법 ##############################
#include <stdio.h>
#include <stdlib.h> // strlen 함수를 사용하기 위해 필요한 전처리기
int main() {
int data_length; // 문자열 길이 저장할 변수
char data[10] = "Happy";
data_length = strlen(data); // strlen 함수를 통해 문자열의 길이를 구함
printf("문자열의 길이는 %d입니다.\n", data_length);
return 0;
}
2차원 배열
바둑판과 같이 행과 열, 즉 x축과 y축을 가지는 형식의 자료의 경우 우리가 지금까지 배운 배열(1차원 배열)만으로는 표기하기 힘든 부분이 있습니다. 이를 해결하기 위해 다차원배열, 한 차원 높인 배열에 대해서 다루어보겠습니다.
2차원 배열 정의
2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열을 말합니다. 1차원 배열을 선언하는 것과 같이 [ ]를 사용하는데, 2차원 배열의 경우 [ ] 기호를 2번 사용합니다. 2차원 배열의 경우 선언하는 방식은 다음과 같습니다.
(자료형) (변수 이름) [ 행 개수 ] [ 열 개수 ], 아래의 선언된 2차원 배열은 문자형 2차원 배열이며 4개의 행과 4개의 열을 가지는 배열이라고 해석할 수 있습니다.
char Twodim[4][4]; // 4 X 4 형태의 모양을 가지는 배열
char (data[5]) [4]; | data[5]라는 배열을 만들겠다는 뜻입니다. 2차원 배열에서는 전체 그룹의 개수를 의미합니다. (2차원 배열 속 "행"에 해당) |
|
char (data[5]) [4]; | 배열의 각 요소는 char[4]의 크기를 가지며. 배열의 각 요소를 1차원 배열처럼 사용합니다. 2차원 배열에서는 4개의 요소를 가지는 배열을 의미합니다. (2차원 배열 속 "열"에 해당) |
2차원 배열 초기화
2차원 배열도 1차원 배열과 마찬가지로 초기화해야합니다. 2차원 배열을 초기화하는 방법은 다음과 같습니다.
char TwoDimention[2][3] = {{1, 2, 3}, {4, 5, 6}}
2차원 배열 저장 방식
우리는 2차원 개념을 이용하여 행과 열, x축과 y축 개념으로 2차원 배열을 이해하지만, 실제로 컴퓨터는 2차원 개념을 가지지 않기에 1차원 형태로 메모리에 제공합니다. 우리가 2차원 배열을 2차원 형식으로 코드를 짤 수 있는 것은 C언어 문법이 수학 공식을 통해 2차원 개념을 제공하기 때문입니다.