11-4-나.문자 배열 초기화

C는 가장 기본적인 자료형인 문자열형이 없다. 왜 없는가 하면 배열을 사용하면 문자열을 훌륭하게 표현할 수 있기 때문이다. 문자열이란 문자형이라는 동일한 타입의 변수들이 모여서 이루어지는 것이므로 문자형 배열을 선언하면 이 배열이 곧 문자열이 된다. 최대 10자의 문자열을 저장하고 싶다면 다음과 같이 선언한다.

 

char str[11];

 

왜 배열 크기를 10으로 하지 않고 11로 하는가 하면 문자열은 끝 표시를 위해 항상 제일 끝에 NULL 종료 문자(\0)를 붙이기 때문이다. 그래서 배열 크기를 계산할 때 항상 널 문자의 길이를 더해야 한다. 문자형(char) 변수는 문자 하나를 저장할 수 있으므로 이런 변수를 11개 모으면 최대 길이 10자를 저장할 수 있는 문자열이 되는 것이다.

, 한글이나 한자는 우리가 생각하는 1음절이 2바이트를 차지하므로 두 배의 저장 공간이 필요하다. "대한민국"이라는 문자열을 문자형 배열에 저장하려면 이 배열은 최소한 9바이트 이상의 크기를 가져야 한다. 문자열이란 문법적으로 문자형 배열과 거의 같은 뜻이며 문자열이 필요하면 적당한 크기로 문자형 배열을 선언하면 된다.

문자열도 선언하면서 동시에 초기화할 수 있다. 다른 타입의 배열과 마찬가지로 = 구두점과 { } 괄호안에 원하는 문자들을 순서대로 죽 나열하면 된다. 그래서 str배열을 "Korea"라는 문자열로 초기화하고 싶다면 다음과 같이 선언하는 것이 원칙이다.

 

char str[6]={'K','o','r','e','a'};

 

str[0]에 문자 'K'가 들어갈 것이고 str[1]에 문자 'o'가 들어갈 것이고 마지막 요소인 str[5]는 별도의 초기값이 없으므로 자연스럽게 0이 되어 NULL 종료 문자가 된다. 문자열 길이가 5라고 해서 배열 크기도 5여서는 안되며 반드시 1 더 큰 크기로 선언해야 한다. 이 방법이 문자열을 초기화하는 원칙적인 방법(초기값과 콤마의 연속)이며 다른 타입의 배열 초기화 방법과 동일하다. 그러나 이 방법은 문자열이 조금만 길어져도 아주 불편하다. 만약 "2002 Korea/Japan Worldcup"이라는 문자열을 선언하고 싶다고 해 보자.

 

char str[26]={'2','0','0','2',' ','K','o','r','e','a',...........'p'};

 

요렇게 해야 되는데 각 문자를 일일이 ' ' 따옴표로 감싸고 가운데에 콤마를 넣어야 하니 얼마나 불편하고 비효율적인가? 그래서 C는 문자형 배열에 대해서는 특별히 다음과 같은 초기화 방법을 허용한다.

 

char str[]="2002 Korea/Japan Worldcup";

 

= 구두점 다음에 큰 따옴표로 싸여진 문자열 상수를 적으면 이 문자열을 구성하는 문자들을 str 배열 요소에 순서대로 복사한다. 뿐만 아니라 배열의 제일 끝에 널 종료 문자도 자동으로 붙이며 배열 크기를 생략할 경우 문자열 길이+1로 알아서 길이를 계산하기도 한다. 컴파일러가 문자형 배열에 대해 이런 초기화 방법을 허용하는 것은 다른 타입에 비해서는 아주 특별한 예외 처리이다.

문자형 배열에 대해 이런 초기화가 가능한 이유는 각 자리의 크기가 일정해서 문자끼리 확실하게 구분되며 바이트 단위로 복사할 수 있기 때문이다. 이에 비해 정수형이나 실수형은 각 요소의 크기가 가변적이어서 초기값의 형태만으로는 어디까지가 몇 번째 요소인지 구분되지 않는다. int ar[]={12345}; 라고 한다고 해서 ar 배열에 차례대로 1, 2, 3, 4, 5가 들어가는 것은 아니며 반드시 콤마로 구분된 값을 나열해야 한다. 컴파일러가 문자열 초기화에 문자열 상수를 사용할 수 있도록 해 주므로 한글이나 한자같은 2바이트 문자열도 큰 따옴표안에 그대로 기록하기만 하면 된다. 다음처럼 말이다.

 

char message[]="이름을 入力하시오.";

 

만약 이런 초기화 방식을 허용하지 않는다면 한글 코드를 일일이 조사해서 써야 하므로 아주 불편할 것이다.