본문 바로가기
C언어

C언어 기초 part 2-1. 배열

by algosketch 2020. 1. 21.

part 2. 배열과 포인터

  • 배열

 

1. 배열

 배열 공부에 앞서 배열이 필요한 상황, 현재로서는 해결할 수 없는 상황을 가정해 보자. 예를 들어 다음과 같은 상황이 있다. 한 한급의 인원은 30명이고 각각 수학 성적이 주어진다. 수학 성적의 평균을 구하시오. 이를 해결하기 위해 지금까지 공부한 것만을 이용하면 다음과 같은 상황이 된다. int math_score1, math_score2, math_score3, ...;

 배열을 이용한다면 성질이 비슷한 여러 개의 변수를 하나의 이름으로 묶어 정의할 수 있다. 그 꼴은 다음과 같다.

// 형태 1
//자료형 이름[길이];
int math_score[30]; // 길이 30만큼 메모리 공간이 할당된다. (int는 4byte이므로 4*30=120byte)

// 형태 2
//자료형 이름[] = {원소1, 원소2, ..., 원소10};
int math_score[] = {1, 2, 3, ..., 10}; // 자동으로 길이 10으로 초기화, 길이를 명시해도 상관 없다.

// 형태 3
//자료형 이름[10] = {원소1, 원소2, ..., 원소10};
int math_score[10] = {1, 2, 3, 4,}; // 마지막에 ','를 작성해야 정확한 문법이다. 지정해주지 않은 원소는 자동으로 0으로 초기화 된다.

 

 보다시피 배열을 선언하는 방법에는 여러 가지가 있다. 한 가지 주의할 점은 [형태 1]과 같은 경우엔 메모리 공간을 할당하지만 그 공간을 [형태 3]처럼 0으로 초기화해주는 것은 아니다. 저 공간에는 아무 의미 없는 쓰레기 값이 들어 있다. (사용했던 메모리 공간을 반환받아 다시 할당하는 경우 우연히 적절한 값이 들어 있는 경우도 있으나 이것은 우연일 뿐이다.) 전역 변수로 선언하면 자동으로 0으로 초기화가 되지만 여기까지 기억할 필요는 없다. 배열은 메모리상에서 연속적으로 할당된다는 특징이 있다. 비슷한 개념인 리스트는 그렇지 않다.(파이썬에서 배열 대신 사용하는 자료형, C에서 리스트를 사용하려면 따로 구현하거나 라이브러리를 이용해야 한다.)

 위의 문제를 배열을 이용하여 해결해 보겠다.

int scores[30];
int total = 0;
float avg;

for(int i = 0; i < 30; ++i) {
    scanf("%d", &scores[i]); // i+1번째 학생의 점수 입력
    total += scores[i];
}
avg = total / 30.0;  // 계산하는 값이 모두 int형이면 계산 결과도 int로 나오기 때문에 30대신 30.0으로 대체하여 float형으로 계산되도록 유도.
printf("%.2f", avg); // 소수점 2자리까지 출력

 

 괄호[ ] 안에 변수를 넣어 각 요소에 접근이 가능하다.

 

 사실 배열까지 공부했다면 프로그래밍으로 대부분 표현할 수 있다. (사실 배열에 대한 설명도 아직 안 끝났다.)그러므로 이 이후에 공부하게 될 내용은 대부분 C언어만의 특징이라고 생각해도 좋다. 바꿔 말하면 지금까지 배운 내용은 다른 언어를 배워도 사용하는 단어만 다를 뿐 똑같은 내용이다.

 그럼 앞으로 배울 내용은 무엇이냐? 프로그램을 빠르게(포인터)하고 코드에 구조(구조체)를 만들고 유저가 입력한 내용을 저장(파일 입출력) 한다. 이 정도가 되겠다.