[CS] 배열: 메모리부터 전역변수까지

hee.moon·2022년 9월 1일
0

Computer Science

목록 보기
8/15
post-thumbnail
/* 모두를 위한 컴퓨터 과학(CS50 2019) 정리본입니다. */

1. 메모리: 컴퓨터의 RAM


어떤 자료형의 변수를 선언하면 메모리상 어딘가에 특정 크기만큼의 자리를 차지한다. 아래 표는 저저번 시간에 배웠던 자료형과 그 자료형이 차지하는 메모리 크기를 정리한 것이다.

타입설명차지하는 메모리 크기
bool불리언 표현 (예: True, False, 1, 0, yes, no)1바이트
char문자 하나 (예: 'a', 'Z', '?')1바이트
string문자열?바이트
int특정 크기 또는 특정 비트까지의 정수 (예: 5, 28, -3, 0)4바이트
long더 큰 크기의 정수8바이트
float부동소수점을 갖는 실수 (예: 3.14, 0.0, -28.56)4바이트
double부동소수점을 포함한 더 큰 실수8바이트

컴퓨터는 RAM이라는 물리적 칩이 메모리 역할을 한다. 예를 들면, 아래 사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미한다고 볼 수 있다(아래 사진은 강의자료에서 가져왔다).

char타입의 변수 하나를 생성하고, 그 값을 입력한다면, 위 사진의 작은 사각형 안에 그 변수의 값이 저장되는 거다.


2. 배열


점수의 평균을 출력하는 프로그램을 C 언어로 만들어보자.

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

int main(void)
{
	int score1 = 72;
    int score2 = 73;
    int score3 = 33;
    
    printf("Average: %i\n", (score1 + score2 + score3) / 3);
}

위 코드에서 혹시 계산에 추가해야할 점수의 갯수가 많아지는 경우를 고려해서 수정해야한다. 이 수정에 배열 개념을 활용할 수 있다. 배열은 같은 자료형의 데이터를 메모리상에 연이어서 저장하고, 이를 하나의 변수로 관리하기 위해 사용된다. 배열을 활용해서 위 코드를 아래와 같이 바꿀 수 있다.

#include <sc50.h>
#include <stdio.h>

int main(void)
{
	int scores[3]; // int자료형의 크기가 3인 배열을 scores라는 이름으로 생성
    scores[0] = 72;
    scores[1] = 73;
    scores[2] = 33;
    
    printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / 3);
}

배열을 사용했지만, 아직도 위 코드는 재사용성이 떨어진다. 점수의 갯수가 늘어나면 코드도 길어진다. 배열을 동적으로 선언하고 저장하는 방법으로 사용해야 한다.


2-1. 전역 변수

전역변수 N을 사용하여 scores 배열의 크기를 정해주자! 만약 N이 고정된 값(상수)이라면 그 값을 선언할 때 const를 앞에 붙여서 전역 변수, 즉 코드 전반에 거쳐 바뀌지 않는 값임을 지정해줄 수 있다. 전역변수의 이름은 대문자로 표기하는 것이 관례다.

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

// 전역변수 N
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의 크기를 전역변수로 선언했기 때문에 점수 갯수가 바뀌었을 때 수정해야 하는 코드가 줄었다.


2-2. 배열의 동적 선언 및 저장


아래 코드에서와 같이 루프와 함수를 선언해서 좀더 동적인 프로그램을 작성할 수 있다. 배열의 길이를 사용자에게 직접 입력받고, 그 길이만큼 for문을 돌면서 각 인덱스에 해당하는 값을 사용자에게 입력받아 저장한다. 그리고 average라는 함수를 따로 선언하여 평균을 구한다. 이와 같은 방법을 통해 어떠한 점수 갯수와 점수 값도 커버할 수 있는 프로그램을 작성할 수 있다.

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

// average 함수가 있다는 것을 알려줌
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); // 0+1, 1+1, 2+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;
}
profile
Frontend Engineer

0개의 댓글

관련 채용 정보