본문 바로가기
Development/C

(C언어 기초) 12. 배열

by eoieiie 2023. 9. 3.

지금까지 메모리에 저장 공간을 확보할 때 변수를 선언했었습니다. 예를 들어 5개 과목의 점수를 처리하고 싶다고 가정해봅시다. 

 

int kor, matth, eng, social, science;

 

이렇게 하나씩 따로 선언하면 점수도 일일이 하나씩 넣어줘야 합니다. 즉 이름이 별도로 존재하기에 반복문 사용이 불가능합니다. 그래서 우리는 같은 형태의 많은 데이터를 반복문으로 처리하기 위해서 메모리에 연속적으로 저장해놓고 쪼개서 사용하는 방법을 사용합니다. 이를 배열이라고 합니다. 

 

배열 선언은 간단합니다. 요소의 자료형에 이름을 붙이고 필요한 요소의 개수를 표시합니다. int형의 요소가 5개인 배열을 선언하는 예는 다음과 같습니다.

 

int ary[5]; // int = 자료형, ary = 배열명, 5 = 요소 개수

 

배열을 선언한 후 5명의 나이를 저장하고 사용하는 방법을 예제로 확인해보겠습니다. 

 

#include <stdio.h>

int main(void)
{
    int ary[5]; //int형 요소 5개의 배열 선언

    ary[0] = 10; // a첫 번째 배열 요소에 10 대입
    ary[1] = 20; // 두 번째 배열 요소에 20 대입
    ary[2] = ary[0] + ary[1]; // 첫 번재 요소 + 두 번째 요소 = 세 번째 요소
    scanf("%d", &ary[3]); // 네 번째 요소는 입력받아 저장

    printf("%d\n", ary[2]);
    printf("%d\n", ary[3]);
    printf("%d\n", ary[4]); // 없으므로 쓰레기 값. 

    return 0;
}


//실행 결과(입력 = 4)

4
30
4
9966776

 

배열의 사용


배열을 선언할 때와  배열 요소를 사용할 때  대괄호([]) 안의 숫자는 의미가 다릅니다. 선언시에는 배열 요소의 전체 개수를 표시하며,  사용할 대는 각 요소가 배열에서 몇 번째에 있는지를 의미합니다. 

 

배열을 선언할 때  배열 요소를 사용할 때
int ary[5]; (배열 요소의 개수 = 5개) ary[0] = 10; (배열에서의 위치 = 첫 번재)

 

배열 초기화


배열도 변수와 마찬가지로 최초 할당된 저장 공간에는 쓰레기 값이 저장되어 있습니다. 원하는 값을 가지려면 선언과 동시에 초기화를 해야 합니다. 방법은 다음과 같습니다. 

 

int ary1[5] = {1, 2, 3, 4, 5};

 

1 2 3 4 5
ary[0] ary[1] ary[2] ary[3] ary[4]

 

만약 초깃값이 배열 요소의 개수보다 작으면 왼쪽부터 차례대로 초기화하고 남은 배열 요소는 모두 0으로 채웁니다. 

 

int ary2[5] = {1, 2, 3};

 

1 2 3 0 0
ary[0] ary[1] ary[2] ary[3] ary[4]

 

자동 초기화 기능을 사용하면 배열 요소 개수가 아무리 많아도 한꺼번에 초기화할 수 있습니다. 

 

int ary[1000] = {0};

 

배열 요소 개수가 생략된 경우도 있습니다. 이 경우 컴파일러는 배열 요소 개수를 초깃값 개수만큼 정합니다. 

 

int ary3[] = {1, 2, 3};

 

1 2 3
ary[0] ary[1] ary[2]

 

또한 자료형에 맞는 초기화를 해야 합니다. 

 

double ary1[4] = {1.2, 0.5, 0.3, 0.9};
char ary2[4] = {'l', 'o', 'v', 'e'};

 

배열과 반복문


연속된 배열 요소를 일일이 변수처럼 떼어서 사용하기보다는, 같은 작업을 반복할 때 유리한 반복문들을 사용하면 더 쉽게 구현할 수 있습니다. 예제로 배열과 반복문을 사용해 성적 처리 프로그램을 만들어 보겠습니다. 

 

#include <stdio.h>

int main(void)
{
    int score[5]; //다섯 과목의 성적을 입력할 int형 배열 선언
    int i; //반복 제어 변수
    int total = 0; // 총점을 누적할 변수
    double avg; // 평균을 저장할 변수

    for (i = 0; i < 5; i++) //i가 0부터 4까지 다섯 번 반복
    {
        scanf("%d", &score[i]); //각 배열 요소에 성적 입력
    }


    for (i = 0; i < 5; i++)
    {
        total += score[1]; //성적을 누적해 총점 계산
    }
    avg = total / 5.0; // 평균 계산

    for (i = 0; i < 5; i++)
    {
        printf("%5d", score[i]); //성적 출력
    }
    printf("\n");

    printf("평균 : %.1lf\n", avg); //평균 출력

    return 0;
}

 

보통 많은 양의 데이터를 처리하므로 배열을 다룰 때는 반복문 사용이 필수입니다. 따라서 배열 요소의 개수가 바뀌면 배열을 처리하는 반복문을 모두 수정해야 하는 부담이 있습니다. 이럴 때 배열 요소의 개수를 다음과 같이 구하면 됩니다. 

 

sizeof(배열명) / sizeof(배열 요소)

 

성적 처리 프로그램을 다음과 같이 수정해 보겠습니다. 

 

#include <stdio.h>

int main(void)
{
    int score[5];
    int i;
    int total = 0;
    double avg;
    int count; //배열 요소의 개수를 저장할 변수

    count = sizeof(score) / sizeof(score[0]); //배열 요소의 개수 계산

    for (i = 0; i < count; i++) //계산한 count 만큼 반복
    {
        scanf("%d", &score[i]);
    }


    for (i = 0; i < count; i++)
    {
        total += score[i];
    }
    avg = total / (double)count; //총합을 count로 나누어 평균 계산

    for (i = 0; i < count; i++) //count만큼 반복
    {
        printf("%5d", score[i]); 
    }
    printf("\n");

    printf("평균 : %.1lf\n", avg);

    return 0;
}

 

sizeof 연산자를 배열명에 사용하면 배열 전체의 크기를 바이트 단위로 계산합니다. 이 값을 배열 요소 하나의 크기로 나누면 배열 요소의 개수를 구할 수 있습니다. 연산자를 다룰 때 보았듯이 sizeof 연산자는 변수들의 크기를 일정한 바이트값으로 변환시킵니다. 예제에서는 총 5개의 변수를 입력했고, int형 변수인 각각의 요소의 크기는 4바이트이므로 총 20바이트를 sizeof(score)안에 할당하게 됩니다. 우리에게 필요한 것은 변수의 개수이므로, sizeof(score)를 배열 요소 하나의 크기sizeof(score)를 가져와서 나누어주면 됩니다.  이렇게 하면 나중에 요소의 개수를 바꾸더라도 나머지 코드를 수정할 필요가 없어집니다. 

 

확인 문제 


 다음 설명에 따라 배열을 선언하세요.

 

  • 정수 5개를 저장할 배열
  • 실수 10개를 저장할 배열 
  • 배열 요소 개수가 3개인 int형 배열
  • 첨자의 최댓값이 4인 char형 배열
더보기
int ary[5];

double ary[10];

int ary[3]

char ary[5];

 

 

다음 그림과 일치하도록 배열을 선언하고 초기화하세요. 

 

1 2 3 0 0 0
int형 int형 int형 int형 int형 int형
더보기
int ary[6] = {1, 2, 3};

 

 

다음과 같이 초기화된 A배열의 값을 복사해 B배열을 채운 후 출력하는 프로그램을 작성하세요. 

 

A배열의 값이 복사된 B배열의 상태
1 2 3 1 2 3 1 2 3 1
더보기
#include <stdio.h>

int A[3] = {1, 2, 3};
int B[10];
int i;

int main(void)
{
    for (i = 0; i < 10; i++)
    {
        B[i] = A[i % 3]; //A배열 첨자가 0~2를 가지도록 나머지 연산자 사용(0,1,2,0,1,2...)
    }

    for (i = 0; i < 10; i++)
    {
        printf("%2d", B[i]);
    }

    return 0;
}

 

 

댓글