[배열] 배열(2)

woodstock·2024년 2월 21일
post-thumbnail

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

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

전역 변수

#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[]를 입력으로 받는다. 함수 안에서는 배열의 길이만큼 루프를 돌면서 값의 합을 구하고 최종적으로 평균값을 반환한다.

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

생각해보기

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

정답

동적 코드

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

정적 코드

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

0개의 댓글