9-2-나.1차 배열 초기화

배열을 선언할 때 초기값을 주는 방법도 일반 변수와 마찬가지이다. int i=3; 과 같이 변수명 다음에 = 기호를 쓰고 초기값을 지정한다. 배열의 초기화가 일반 변수와 다른 점은 값의 묶음을 한꺼번에 전달해야 하기 때문에 초기식에 { } 괄호와 각 초기값들 사이에 콤마를 사용한다는 점이다.

 

type 배열명[크기]={초기화 값들};

 

선언문 바로 다음에 = 기호와 { }괄호를 쓰고 괄호안에 초기값들을 콤마로 구분하여 다음과 같이 나열한다. 배열뿐만 아니라 일반 변수도 int i={5}; 식으로 초기식에 { } 괄호를 사용할 수 있는데 일반 변수는 단일값으로 초기화하므로 굳이 { }괄호를 쓸 필요가 없는 것이다. 배열은 여러 개의 값을 나열해야 하므로 { } 괄호를 생략할 수 없다.

 

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

 

이렇게 선언과 동시에 초기화를 하면 메모리를 할당받음과 동시에 초기화 값들로 메모리를 채운다(=초기화한다). 선언 직후의 메모리 모양은 다음과 같을 것이다.

초기식에 있는 값들이 순서대로 각 배열 요소에 대입되었다. 만약 선언과 동시에 배열을 초기화하지 않고 선언 후에 따로 초기화한다면 다음과 같이 일일이 값을 대입하는 방법밖에 없다. 앞절에서 성적 배열을 초기화하기 위해 바로 이 방법을 사용했는데 누가 보더라도 어느쪽이 더 간단하지 쉽게 판단할 수 있을 것이다.

 

int ar[5];

ar[0]=4;

ar[1]=8;

ar[2]=3

ar[3]=69;

ar[4]=-7;

 

다음은 배열 초기화 문장에 대한 문법적인 분석을 해 보자. 다음 두 문장은 과정은 다르지만 결과는 완전히 동일하다.

 

int i=3;

int i;

i=3;

 

왼쪽은 i를 선언함과 동시에 3으로 초기화한 것이고 오른쪽은 i를 먼저 선언해 놓고 여기에 3을 대입한 것이다. 어느쪽이든지 i는 정수형 변수로 선언되고 이 변수의 초기값은 3이다. 그러나 이 두 문장에서 사용된 = 기호는 완전히 다른 것이다. 왼쪽의 =기호는 변수 선언문과 초기값을 구분하는 구두점(Punctuator)이고 오른쪽의 = 기호는 변수에 값을 대입하는 연산자(Operator)이다.

기본형의 경우는 초기식에 사용되는 = 구두점과 대입문에 사용되는 = 연산자의 사용 방법이 우연히 같지만 이 둘의 동작은 완전히 다르다. = 구두점은 변수명과 이 변수가 기억될 장소의 초기값의 구분에 사용하는데 int i 3; 이렇게 쓸 수 없기 때문에 구분자를 중간에 넣는 것이다. 반면 대입 연산자는 실행중에 우변의 값을 좌변의 변수에 대입한다. 구두점과 연산자의 동작이 다르다는 것이 왜 중요한가 하면 이 둘을 헷갈리면 다음과 같은 엉뚱한 코드를 작성할 위험이 있기 때문이다.

 

int ar[5];

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

 

배열 초기화에 사용되는 = 기호가 연산자라고 오해하게 되면 선언한 후에 = 로 배열 요소 전체의 값을 한꺼번에 대입할 수 있다고 잘못 이해하게 된다. 실행중에 배열 요소 전부를 한꺼번에 대입할 수 있는 편리한 방법은 제공되지 않는다. 배열 요소를 한꺼번에 초기화할 수 있는 방법은 선언할 때 초기값을 주는 방법밖에 없으며 이는 다음에 배울 구조체에도 동일하게 적용된다.