본문 바로가기
프로그래밍/C언어

C언어 공부하기 - 배열

by 헬맷쓰다 2020. 10. 5.
반응형

일차원 배열

지금까지 C언어에서 변수를 선언하고 사용한 예제에서는 변수 하나당 하나의 값만 사용할 수 있었습니다. 예를 들어 학생 5명의 성적을 다루는 프로그램을 짜려면 아래와 같이 변수를 5개 사용해야 합니다. 그리고 선언한 변수의 이름을 일일이 기억을 하고 있다가 해당 학생에 맞는 변수에 성적을 대입시켜야 합니다. 점수를 영어로 score라고 하니까 순서대로 1부터 5까지 번호를 붙여서 처리하면 별 문제가 없어 보입니다. 그런데 score4를 보면 선언을 할 때 오타가 났네요. 뭐 오타가 나면 컴파일러가 잡아주니까 수정을 하면 됩니다. 그런데....

short int score1;
short int score2;
short int socre3;
short int socer4;
short int socre5;

score1 = 30;
score2 = 50;
score3 = 80;
score4 = 95;
score5 = 75;

지금은 5명 밖에 안되지만 학생수가 10명 20명이 넘는다면?

변수를 10개, 20개를 잡아도 되겠지만 C언어에서는 배열(Array)이라는 자료구조가 있어서 그걸 사용하면 됩니다. 배열은  자료형이 같은 변수 여러 개를 사용하려고 할 때 쓰는 거니까 위의 예제는 다음과 같이 변경을 할 수 있습니다.

short int score[5];
score[0] = 30;
score[1] = 50;
score[2] = 80;
score[3] = 95;
score[4] = 75;

일반적인 변수의 선언과 비슷한데 변수의 뒤에 대괄호와 숫자가 들어 있습니다. 위에서 배열을 선언한 의미를 풀어서 쓰자면 "short int 형 배열 score를 선언하는데 크기가 5개" 라는 뜻입니다. 배열을 선언할 때 대괄호 안에 들어가는 숫자는 배열의 크기를 뜻하고, 배열에 값을 입력할 때 대괄호 안에 들어가는 숫자는 "첨자(index)"라고 합니다.

첨자(index)의 시작은 "1"이 아니라 "0"부터 시작한다는 사실을 반드시 기억해 두세요.

 

 

일차원 배열 초기화

에이~ 변수 선언부분만 제외하고 실제로 변수를 초기화할 때는 어차피 개별적으로 해줘야 되네요. 별로 새로울 것도 없네요. 라고 하기엔 너무 성급한 판단입니다. 다음과 같이 선언과 동시에 초기화가 가능합니다.

short int score[5] = {30, 50, 80, 95, 75};

어때요? 처음보다 엄청 깔끔하게 정리가 됐지 않나요?

C언어 스토리지 클래스 기억하시나요? 변수에는 자동변수, 정적변수, 외부변수, 레지스터변수가 있다고 했었죠? 배열에서는 레지스터 변수만 제외하고 다 사용할 수 있습니다. 여기서 잠깐 복습을 하자면, 자동변수는 함수안이나 모듈내에서 선언하는 변수로 초기화가 되어 있지 않고 함수나 모듈을 빠져나가면 사라지는 변수죠. 정적변수는 프로그램이 종료될 때까지 살아 있는 변수로 초기화하지 않으면 0이나 NULL로 값이 세팅되어 있습니다. 외부변수는 정적변수와 비슷한데 함수 외부에 선언하여 사용하는 변수입니다. 

다음과 같이 코드를 작성했다고 합시다.

short int score[5] = {30, 50, 80};

배열의 크기는 5인데 값을 3개만 초기화 했습니다. 이렇게 하면 배열의 첫 번째 요소부터 3개에만 값이 들어갑니다. 그러면 나머지 두 개 요소의 값은 어떻게 될까요? 답은 0으로 초기화됩니다. 위 코드는 프로그래머가 버그를 집어넣은 게 명백합니다. 당연해 배열의 크기와 초기화시킨 값의 개수가 다르기 때문입니다.

그런데, 경우에 따라서는 의도적으로 배열의 크기와 초기화 값의 갯수가 다르게 설정을 하는 경우도 있습니다. 다음 코드는 위의 코드와 딱 한 개만 다르군요.

short int score[5] = {30, 50, 80,};

마지막 초기화 값의 뒤에 콤마(,)를 찍었습니다. 이렇게 하면 배열의 세번째 요소 다음 것들은 0으로 초기화한다는 명시적 표현입니다. 결과적으로는 별 차이가 없어 보입니다만 알고 했느냐 모르고 했느냐는 엄청난 차이가 있음을 명심하세요.

 

 

배열의 크기가 없는 배열

만약에 학생 수가 현재 5명이지만 학생 수가 늘어나거나 줄어들면 배열의 크기를 바꿔 줘야 겠죠? 근데 사람이 늘거나 줄 때마다 배열의 크기를 바꾸는 게 귀찮습니다. 그래서 최대 30명까지 성적을 처리하겠다고 아래와 같이 작성을 해줍니다.

short int score[30] = {30, 50, 80, 95, 75,};

학생 수가 30명이 되기 전까지는 메모리에 낭비가 있겠네요. 또, 30명을 넘어서면? 큰일이겠죠.

그래서 C언어에서는 배열의 크기가 없는 배열을 선언과 동시에 초기화할 수 있습니다.

short int score[] = {30, 50, 80, 95, 75};

이렇게 하면 score[]라는 배열은 배열의 요소가 5개인 score[5]와 동일하게 작동을 합니다. 주의할 점은 이렇게 선언과 동시에 초기화를 할 경우에만 배열의 크기가 없어도 되고, 선언만 할 경우는 오류가 발생합니다.

 

정리하면,,, 배열은 자료형 여러개를 연속적으로 사용을 하고자 할 때 쓰는 변수입니다. 그리고 선언과 동시에 초기화를 할 수 있어 깔끔하고 직관적인 자료를 관찰할 수 있습니다. 그리고 프로그램 중간중간에 배열의 각 요소의 값을 초기화하거나 변경을 할 수 있는데 이런 경우 배열의 이름이 같고 첨자만 같기 때문에 개별적으로 변수 이름을 사용하는 것보다 덜 직관적일 수 있습니다. 배열의 크기는 컴파일 과정에서 고정이 되기 때문에 적절한 크기의 산출에 대한 고민이 필요합니다.

 

반응형

댓글