어떤 자료형의 변수를 선언하면 메모리상 어딘가에 특정 크기만큼의 자리를 차지한다. 아래 표는 저저번 시간에 배웠던 자료형과 그 자료형이 차지하는 메모리 크기를 정리한 것이다.
타입 | 설명 | 차지하는 메모리 크기 |
---|---|---|
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
타입의 변수 하나를 생성하고, 그 값을 입력한다면, 위 사진의 작은 사각형 안에 그 변수의 값이 저장되는 거다.
점수의 평균을 출력하는 프로그램을 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);
}
배열을 사용했지만, 아직도 위 코드는 재사용성이 떨어진다. 점수의 갯수가 늘어나면 코드도 길어진다. 배열을 동적으로 선언하고 저장하는 방법으로 사용해야 한다.
전역변수 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의 크기를 전역변수로 선언했기 때문에 점수 갯수가 바뀌었을 때 수정해야 하는 코드가 줄었다.
아래 코드에서와 같이 루프와 함수를 선언해서 좀더 동적인 프로그램을 작성할 수 있다. 배열의 길이를 사용자에게 직접 입력받고, 그 길이만큼 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;
}