[배열] 배열(2)

·

2 min read

[배열] 배열(2)

우리가 특정 자료형의 변수를 선언하면 이는 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 된다. 만약 비슷한 종류의 값을 모아서 저장하고 싶다면 어떻게 해야 할까?

메모리상에서 여러 값을 연이어서 저장하고 사용하는 방법과 그 이점을 알아보자.

전역 변수

#include <cs50.h>
#include <stdio.h>

const int N = 3;

int main(void)
{
    // 점수 배열 선언 및 값 저장
    int scores[N];
    scores[0] = 72;
    scores[1] = 73;
    scores[2] = 33;

    // 평균 점수 출력
    printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / N);
}

위 코드에서 scores 배열의 크기를 정해주는 N이라는 변수를 새로 선언하였다.

만약 N이 고정된 값(상수)이라면 그 값을 선언할 때 const를 앞에 붙여서 전역 변수, 즉 코드 전반에 거쳐 바뀌지 않는 값임을 지정해줄 수 있다.

관례적으로 이런 전역 변수의 이름은 대문자로 표기한다.

배열의 동적 선언 및 저장

아래의 코드같이 루프와 함수를 선언하여 좀 더 동적인 프로그램을 작성할 수 있다.

#include <cs50.h>
#include <stdio.h>

float average(int length, int array[]);

int main(void)
{
    // 사용자로부터 점수의 갯수 입력
    int n = get_int("Scores:  ");

    // 점수 배열 선언 및 사용자로부터 값 입력
    int scores[n];
    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score %i: ", i + 1);
    }

    // 평균 출력
    printf("Average: %.1f\n", average(n, scores));
}

//평균을 계산하는 함수
float average(int length, int array[])
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return (float) sum / (float) length;
}

여기서는 배열의 크기를 사용자에게 직접 입력 받고, 배열의 크기만큼 루프를 돌면서 각 인덱스에 해당하는 값을 역시 사용자에게 동적으로 입력 받아 저장한다.

그리고 average 라는 함수를 따로 선언하여 평균을 구한다.

average 함수는 lengtharray[]를 입력으로 받는다. 함수 안에서는 배열의 길이만큼 루프를 돌면서 값의 합을 구하고 최종적으로 평균값을 반환한다.

이와 같은 방법을 통해서 임의의 점수 개수와 점수 배열에 대해서 동적으로 평균값을 구하는 프로그램을 작성할 수 있다.

생각해보기

점수의 평균을 구하는 예제에서, 동적으로 작성한 코드는 그렇지 않은 코드에 비해 어떤 장단점이 있을까?

정답

동적 코드

  • 장점: 유연하고 사용자의 입력에 따라 배열 크기가 조정된다.
  • 단점: 더 복잡하고, 메모리 관리가 필요하며, 성능에 영향을 줄 수 있다.

정적 코드

  • 장점: 간단하고 메모리 사용이 예측 가능하며, 성능이 좋다.
  • 단점: 유연성이 부족하고, 확장성이 낮으며, 사용자 입력에 제한이 있다.