본문 바로가기

C언어 강좌

[C언어_10] 1차원 배열 & 배열을 이용한 문자열 처리

안녕하세요,

이번 포스팅에서는 1차원 배열과 배열을 이용한 문자열 변수 표현에 대해 알아보는 시간을 갖도록 하겠습니다.

 

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

하지만 선언방법부터 접근방법까지 일반적인 변수들과는 차이가 있습니다.


| 배열이란 무엇인가?

다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열입니다.

 

예를 들어서,

'A아파트'의 가구별 가족 수를 저장하는 프로그램을 만든다고 가정해봅시다. 'A아파트'는 10층까지 있고 각 층에는

4가구씩 살고 있습니다. 그렇다면 가구별 가족 수의 기록을 위해서는 총 40개의 변수를 선언해야 하는데, 이를

위해서는 아마도 다음과 같이 코드를 작성해야 할 것입니다.

void main()
{
      int floor101, floor102, floor103, floor104; // 1층 101호부터 104호까지
      int floor201, floor202, floor203, floor204; // 2층 201호부터 204호까지
      int floor301, floor302, floor303, floor304; // 3층 301호부터 304호까지
      int floor401, floor402, floor403, floor404; // 4층 401호부터 404호까지
      .
      .
      .
}

이렇게 코드를 작성한다는 것은 프로그래머에게 있어서 아주 끔찍한 일입니다. 물론 저 정도는 그나마 할만하다고 생각할 수 있을지 모릅니다. 하지만 층별로 20가구가 살고, 30층 높이의 B동~G동까지 있는 아파트의 가구별 가족 수를 기록하는 프로그램을 만든다고 하면 매우 힘들 것입니다.

 

바로 이러한 상황에서 배열은 우리가 힘든 일을 겪지 않아도 되도록 편의를 제공해줍니다. 배열을 사용하면 그 수에 

상관없이 한 번에 많은 수의 변수를 선언할 수 있기 때문입니다.

 

 


| 1차원 배열의 선언에 필요한 것 : 배열이름, 자료형, 길이정보

 

배열은 일반적인 변수와 달리 여러 개의 값을 저장할 수 있다. 여러 개의 변수가 모여서 배열을 이루기 때문입니다.

이러한 배열 중에서 1차원 배열은 다음과 같이 선언합니다.

 

int Array[4];

 

위의 문장을 이루는 요소 셋은 다음과 같습니다.

 

  • int           배열을 이루는 요소(변수)의 자료형
  • Array        배열의 이름
  • [4]           배열의 길이

즉, 위의 배열 선언문이 의미하는 바는 다음과 같습니다.

 

"int형 변수 4개로 이뤄진 배열을 선언하되, 그 배열의 이름은 Array로 해라"

 

길이가 4인 int형 1차원 배열

위 그림에서 중요한 사실은 int형 변수 4개가 '나란히' 선언되어 있다는 점입니다.

 

참고로 다양한 자료형과 다양한 길이의 1차원 배열은 다음과 같이 선언하면 됩니다.

      int arr1[7];

      float arr2[10];

      double arr3[12];

 

 


| 선언된 1차원 배열의 접근

 

배열의 선언방법을 알았으니, 이제 접근 방법을 살펴볼 차례입니다.

 

int arr[3];       //  길이가 3인 int형 1차원 배열 

 

위의 배열을 대상으로 값을 저장할 때에는 다음의 형태로 접근을 합니다.

 

arr[0] = 10;       //  배열 arr의 첫 번째 요소에 10을 저장해라!

arr[1] = 12;       //  배열 arr의 두 번째 요소에 12을 저장해라!

arr[2] = 25;       //  배열 arr의 세 번째 요소에 25을 저장해라!

 

즉, 배열요소의 접근에는 다음의 식이 존재합니다.

 

arr[idx] = 20;      ->      "배열 arr의 idx+1번째 요소에 20을 저장해라!"

 

이렇듯 [ ] 연산자 사이에 배열의 위치정보(인덱스)를 명시하게 되는데, 

여기서 중요한 사실은 첫 번째 요소를 지칭할 때 사용되는 숫자가 1이 아닌 0이라는 점입니다.

 

즉, 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0에서부터 시작됩니다.

 

 


| 배열 선언과 동시에 초기화

 

기본 자료형 변수들은 선언과 동시에 초기화가 가능합니다.

마찬가지로 배열도 선언과 동시에 원하는 값으로 초기화할 수 있습니다.

 

초기화의 방법은 총 3가지로 구분이 가능합니다.

 

  1. int arr1[5] = {1, 2, 3, 4, 5};                        // 순차적으로 1, 2, 3, 4, 5로 초기화 함 

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

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

각 방법을 조금 더 살펴보자면,

  1. 중괄호 안에 초기화 할 값들을 나열하면, 해당 값들이 순서대로 저장됩니다. (중괄호로 묶인 부분을 가리켜 '초기화 리스트'라 한다.)
  2. 초기화를 목적으로 '초기화 리스트'가 선언되면, 배열의 길이정보를 생략할 수 있습니다. 이러한 경우에는 컴파일러가 초기화 리스트의 수를 참조하여 길이정보를 자동으로 채워주기 때문입니다. 즉, int arr2[7]={1, 2 ,3 ,4 ,5 ,6 ,7}과 동일합니다. 
  3. 선언하는 배열의 길이는 5인데, 초기화할 값이 2개밖에 존재하지 않습니다. 이러한 경우 첫 번째 요소부터 순차적으로 값을 채워나가되, 채울 값이 존재하지 않는 요소들은 0으로 채워지게 됩니다.

 


| 배열을 이용한 문자열 변수의 표현

 

C언어에서는 큰 따옴표를 이용해서 문자열을 표현합니다.

따라서 다음과 같이 문장을 구성하면 배열에 문자열이 저장됩니다.

 

char str[14] = "Good morning!";

 

이 배열에는 다음의 형태로 문자열이 저장되게 됩니다.

문자열 배열

물론, 위에 초기화 방법 중 2번째와 같이 배열의 길이를 생략하는 것도 가능합니다. 

 

그런데 문자의 수는 중간에 삽입된 공백 문자를 포함하여 분명 13입니다. 그러나 위의 그림에서 보이듯 문자열의

끝에는 '|n'이라는 특수문자(escape sequence)가 자동으로 삽입이 되어 실제 문자열의 길이는 14가 됩니다.

 

따라서, 문자열의 저장을 목적으로 char형 배열을 선언할 경우에는,

특수문자 '|n'이 저장될 공간까지 고려해서 배열의 길이를 결정해야 합니다.

 

이렇듯 문자열의 끝에 자동으로 삽입되는 문자 '|n'를 가리켜 '널(null)' 문자라고 합니다.

 


이상으로 이번 포스팅 마치겠습니다.

피드백 사항이나 질문이 있으시다면 댓글 달아주시고, 공감도 한 번씩 눌러주시면 감사하겠습니다.