9-2-다.초기식

배열을 선언과 동시에 초기화할 때는 초기값의 개수가 배열 크기와 일치하는 것이 가장 이상적이다. 다음과 같이 말이다.

 

int ar[5]={4,8,3,69,-7};

 

ar 배열의 크기가 5이므로 { } 괄호안에 초기값도 다섯 개를 지정했다. 모든 초기식이 다 이런 식으로 작성된다면 사실 아무 문제가 없을 것이다. 배열의 크기가 작다면 초기값을 다 적는 것이 별로 어렵지 않다. 그러나 배열이 엄청나게 크다면 그 초기값을 일일이 나열하기가 귀찮아지고 개발자의 타이핑 시간과 컴파일러의 컴파일 시간을 축내게 된다.

 

int arBig[1000]={1,2,3,0,0,0,0,0, .............. 997개의 0 };

 

arBig 배열은 크기가 1000인데 앞쪽 세 개 요소만 1,2,3으로 초기화하고 나머지는 모두 0으로 초기화하고 싶다고 하자. 이럴 경우 {1,2,3, 다음에 0을 무려 997번 반복해서 써야 할 것이며 무척 불편하고 비효율적이다. 그래서 C는 초기값이 배열 크기보다 적을 경우 나머지 배열 요소들을 전부 0으로 초기화하며 뒤쪽의 0으로 초기화 할 요소에 대해서는 초기값을 따로 적지 않아도 된다.

 

int arBig[1000]={1,2,3};

 

이렇게 쓰면 앞쪽 세 개 요소만 1,2,3으로 초기화하고 arBig[3]~arBig[999] 까지를 모두 0으로 초기화한다. 이런 초기식이 다소 혼란스러워 보일 수도 있으므로 {1,2,3,} 와 같이 초기식의 제일 끝에 여분의 콤마를 찍어 두어 나머지 요소가 모두 0임을 분명히 표시하는 방법을 많이 쓴다. 다음 세 선언문은 비슷해 보이지만 결과는 다르다.

 

int arBig[1000];

int arBig[1000]={0};

int arBig[1000]={0,};

 

선언만 할 경우 배열 요소들은 모두 쓰레기값을 가지지만 ={0}나 ={0,} 초기식을 뒤에 붙이면 모든 배열 요소가 0으로 초기화된다. 지역 배열을 전역 배열처럼 초기화하고 싶다면 선언문 다음에 ={0}만 붙이면 된다. 배열의 중간 부분은 모두 0으로 하고 뒷부분의 일부만 원하는 값으로 초기화하는 방법은 제공되지 않는다. 그래서 arBig 배열을 전부 0으로 초기화하되 arBig[912]만 3으로 초기화하고 싶다면 다음과 같이 한다.

 

int arBig[1000]={0,};

arBig[912]=3;

 

전부 0으로 초기화한 후 원하는 요소에만 별도로 대입을 했다. 다음은 초기값이 배열 크기보다 더 많은 경우를 보자.

 

int ar[5]={4,8,3,69,-7,1};

 

배열 크기는 5인데 초기값은 6개가 주어져 있다. 이 코드를 컴파일하면 too many initializer라는 에러로 처리되는데 즉, 초기값이 너무 많다는 얘기다. 초기값이 남는 경우는 십중 팔구 입력시의 오타가 원인인데 중간에 같은 값을 반복해서 입력했다거나 불필요한 콤마가 하나 더 삽입된 것이다. 배열 크기가 크고 초기값이 많으면 정확하게 개수를 세어서 초기값을 입력하기가 쉽지 않기 때문에 이런 실수를 할 수 있다.

이럴 때는 초기식의 개수를 잘 세어보고 잘못 입력된 것이 없는지 살펴본 후 남는 초기값을 지워야 한다. 컴파일러는 초기값이 모자라면 군말없이 나머지를 0으로 초기화하지만 남을 경우에는 사정없이 에러로 처리해 버린다. 컴파일러가 남는 초기값을 경고도 아닌 에러로 처리하는 이유는 기억 공간이 부족해 다 넣을 수도 없을 뿐더러 남는 초기값은 항상 심각한 문제를 유발하기 때문이다. arBig 배열 초기식의 326번째에 잘못된 중복값이 들어갔다면 327번째 요소부터는 하나씩 밀려 죄다 틀린 값을 가지게 되므로 이 얼마나 심각한가. 마치 시험 잘 보고난 후에 답안지 한칸 밀어 썼을 때와 비슷해진다.

배열 선언문이 초기식을 가질 때는 배열의 첨자 크기를 생략할 수 있다. 다섯개의 초기값을 가지는 ar배열은 다음과 같이 선언하면 된다.

 

int ar[]={4,8,3,69,-7};

 

컴파일러는 이 선언문의 초기식을 보고 개발자가 ar 배열 크기로 5를 원한다는 것을 알 수 있다. 따라서 배열 크기를 생략해도 ar 배열의 크기는 자동으로 5가 되며 이 배열을 위해 20바이트의 메모리가 할당될 것이다. 배열 크기를 생략하면 초기값의 개수가 아주 많을 때 일일이 초기값의 개수를 세어 보지 않아도 되고 차후에 초기값이 늘어나도 그에 맞게 배열 크기도 자동으로 조정되므로 편리하다. 실제 할당된 크기는 물론 sizeof 연산자로 구할 수 있다. 배열을 초기화하는 방법이 쓸데없이 복잡해 보이는데 간단히 정리해 보면 다음과 같다.

 

배열 크기와 초기값이

결과

맞으면

만사 형통

초기값이 모자라면

나머지는 모두 0

초기값이 남으면

에러로 처리됨

배열 크기를 생략하면

개수만큼 자동으로 크기 설정