9-1.배열

9-1-가.배열의 정의

배열에 대해서는 3장에서 간략하게 소개를 한 적이 있는데 이 장에서 배열에 대해 본격적으로 연구해 보자. 유사한 일의 반복이 특기인 컴퓨터의 속성상 배열은 가장 기본적인 자료 구조이며 그래서 특히 입문자에게 중요하다. 배열을 알게 되면 예전에 할 수 없었던 많은 것을 할 수 있게 된다. 사실 지금까지 만들었던 예제 중에도 배열을 사용했으면 훨씬 더 쉽게, 더 간단하게 해결할 수 있는 것들이 있다. 여기서 배열을 공부한 후 이 장 끝에 있는 소코반 게임을 분석해 보고 같이 만들어 보면 프로그래밍이란 어떤 것인지를 어렴풋이 감을 잡게 될 것이다.

3장에서 정의했듯이 배열은 동일한 타입을 가지는 변수들의 유한 집합이다. 배열을 선언하는 기본 형식은 다음과 같다. 일반 변수 선언문과 동일하되 변수명 뒤에 [ ] 괄호(bracket)와 배열 크기 지정문이 온다는 것만 다르다. 배열 선언문에 [ ] 괄호가 하나 있으면 1차원 배열이고 두 개 있으면 2차원 배열이라고 한다.

 

type 배열명[크기][크기]...;

 

type은 어떤 타입의 변수들이 모여 있는지를 지정하는데 정수형 변수들의 모임이면 int, 실수형 변수들의 모임이면 double이라고 적는다. 기본형 외에도 포인터, 구조체, 사용자 정의형 등 임의의 타입이 모두 배열을 구성할 수 있다. 타입 T가 있으면 T형 배열은 언제나 가능하며 심지어 배열의 배열도 선언할 수 있다.

배열명은 말 그대로 배열의 이름이다. 배열명도 명칭이므로 명칭 규칙에 맞게만 작성하면 된다. 관습적으로 배열명에는 ar이나 a같은 접두어를 붙여 이 변수가 배열이라는 것을 쉽게 알 수 있도록 한다. 점수들의 배열이라면 arScore, 사람 이름의 배열이라면 arName, 좌표의 배열이라면 arPos 등으로 이름을 붙인다.

크기는 이 배열이 몇 개의 요소를 가지는지, 즉 몇 개의 변수가 모여서 배열을 구성하는지를 지정하는데 자연수로 된 상수를 적어 준다. 개수이기 때문에 음수나 실수는 당연히 안되며 선언할 때 필요한 메모리양을 계산할 수 있어야 하므로 반드시 상수만 쓸 수 있다. 배열의 차원만큼 크기를 지정하되 1차원 배열이면 [ ] 괄호를 한 번만 써 준다. 다음은 배열 선언의 여러 가지 예이다.

 

int ar[5];                // 크기가 5인 정수형 배열 ar

double avg[10];      // 크기가 10인 실수형 배열 avg

char st[128];          // 크기가 128인 문자형 배열 st

 

int ar[5]; 선언에 의해 컴파일러는 정수형 변수 5개를 저장할 수 있는 연속적인 메모리 공간을 확보한다. 이 배열은 메모리상에 다음과 같이 생성될 것이다.

배열을 구성하는 각각의 개별 변수들을 배열 요소(Element)라고 한다. int ar[5] 선언에 의해 ar[0]부터 ar[4]까지 정수형 배열 요소 다섯 개가 동시에 생성된다. 배열 요소는 동일한 타입을 가지는 변수와 완전히 같은 자격을 가진다. 즉, ar[0]는 int형으로 선언된 변수 i나 j와 같은 정수형 변수로서 정수값 하나를 저장할 수 있으며 i, j가 사용될 수 있는 곳이면 ar[0]도 항상 사용할 수 있다.

자료 구조에는 배열 외에도 연결 리스트, 스택, 큐, 트리 같은 것들이 있다. 다음에 자료 구조를 따로 공부해 보면 알겠지만 이 중 배열이 가장 단순하면서도 사용 빈도가 높다. 다른 자료 구조에 비해 배열은 낭비되는 메모리가 없으며 배열 요소들이 연속적인 공간에 배치되어 있기 때문에 요소를 참조하는 속도가 대단히 빠르다. 하지만 반드시 연속적이어야 한다는 제약이 있어서 새로운 요소를 삽입하거나 기존 요소를 삭제하는 속도는 무척 느리다는 것이 단점이다.

그래서 삽입 삭제가 빈번한 자료를 다룰 때는 배열 대신 연결 리스트를 많이 사용했었다. 하지만 요즘은 CPU의 속도가 워낙 빨라져서 크기가 지나치게 크지 않으면 복잡한 연결 리스트 대신 배열을 사용해도 성능상의 큰 차이가 없다. C 언어는 저수준 언어의 특성상 배열을 많이 사용하는데 문자열 조차도 배열로 표현한다. 그래서 문자열을 자유 자재로 다루고 싶으면 배열에 익숙해져야 한다.