57. 전역 변수

아시는 것처럼 C언어에서는 프로그램에서 관리할 데이터를 할당하고 관리하기 위해 변수에 관한 문법을 제공하고 있죠.

C언어에서는 프로그램의 모든 함수에서 접근할 수 있는 전역 변수와 선언한 블록에서만 접근할 수 있는 지역 변수가 있어요.
그리고 이 외에도 정적 변수와 상수화 변수를 제공하는데 이들에 관해 하나 하나 살펴봅시다.

전역 변수

C언어에서는 변수 선언을 특정 블록 내부가 아닌 외부에 선언한 변수를 전역 변수라 불러요.
전역 변수는 프로그램 시작할 때 할당하고 프로그램 끝날 때 해제하며 프로그램 전제 영역에서 접근할 수 있죠.

예를 들어 50명의 국어 성적을 관리하는 프로그램이 있다고 가정할게요.
그리고 프로그램에 성적을 추가, 삭제, 조회, 전체 보기 메뉴를 제공합시다.
아마도 이 프로그램에는 각 메뉴를 선택했을 때 수행하는 부분을 각각의 함수로 만드는 것이 효과적일 거예요.

이 때 10명의 국어 성적을 기억하는 변수를 어디에 선언하면 좋을까요?
여러가지 방법이 있겠지만 전역 변수로 선언하면 모든 함수에서 접근할 수 있어요.

#define MAX_STUDENT    10
int scores[MAX_STUDENT];

추가 기능에서는 학생 번호를 입력하여 성적을 추가할 학생을 선택하겠죠.

int num = 0;
printf("성적을 추가할 학생 번호를 입력:");
scanf_s("%d",&num);

그리고 학생 성적을 입력받아요.

int score = 0;
printf("성적:");
scanf_s("%d",&score);

학생 성적은 scores 배열에 기억할 것이므로 인덱스 연산을 사용할게요.
입력한 학생 번호에 1을 빼면 되겠네요.
그리고 인덱스 연산으로 참조한 원소에 성적을 대입하여 값을 설정해요.

scores[num-1] = score;

이렇게 추가 기능을 작성하면 전체 보기 기능을 선택하더라도 그 값은 유지되어 원하는 결과를 얻을 수 있어요.

다음은 10 명의 국어 성적을 관리하는 프로그램이예요.
프로그래밍 작성에 관해서는 뒤에서 다시 다루지만 한 번 분석해 보시고 프로그램을 작성해 보세요.

◈ 10 명의 국어 성적을 관리하는 프로그램

#include <stdio.h>
#pragma warning(disable:4996)
#define MAX_STUDENT        10
int scores[MAX_STUDENT];
 
void Init();//초기화
void Run(); //사용자와 상호 작용
char SelectMenu(); //메뉴 선택
void InputScore(); //성적 추가
void DeleteScore();//성적 삭제
void SearchScore();//성적 조회
void ListScore();  //전체 성적 보기
void ViewScore(int num);//특정 학생 성적 보기
 
int main()
{
    Init();
    Run();
    return 0;
}
 
void Init()
{
    int i = 0;
    for (i = 0; i<MAX_STUDENT; i++)
    {
        scores[i] = -1;
    }
}
 
void Run()
{
    char key = 0;
    while ((key = SelectMenu()) != 'e')
    {
        switch (key)
        {
        case 'i': InputScore(); break;
        case 'd': DeleteScore(); break;
        case 's': SearchScore(); break;
        case 'l': ListScore(); break;
        default: printf("잘못 선택하였습니다.\n"); break;
        }
    }
}
 
 
char SelectMenu()
{
    char key[256] = "";
 
    printf("[i]:성적 추가 [d]:성적 삭제 [s]:성적 조회 [l]: 전체 성적 보기\n");
    scanf("%s", key);
 
    return key[0];
}
 
void InputScore()
{
    int num = 0;
 
    printf("성적을 추가할 학생 번호를 입력:");
    scanf("%d", &num);    
 
    if ((num >= 1) && (num <= MAX_STUDENT))
    {
        int score = 0;
        printf("성적:");
        scanf("%d", &score);        
        scores[num - 1] = score;
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
 
void DeleteScore()
{
    int num = 0;
 
    printf("성적을 삭제할 학생 번호를 입력:");
    scanf("%d", &num);    
 
    if ((num >= 1) && (num <= MAX_STUDENT))
    {
        scores[num - 1] = -1;
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
 
void SearchScore()
{
    int num = 0;
    printf("성적을 조회할 학생 번호를 입력:");
    scanf("%d", &num);    
 
    if ((num >= 1) && (num <= MAX_STUDENT))
    {
        ViewScore(num);
    }
    else
    {
        printf("유효하지 않은 번호입니다.\n");
    }
}
 
void ListScore()
{
    int index = 0;
 
    for (index = 0; index < MAX_STUDENT; index++)
    {
        ViewScore(index + 1);
    }
}
 
 
void ViewScore(int num)
{
    if (scores[num - 1] != -1)
    {
        printf("[%d 번]:[성적: %d]\n", num, scores[num - 1]);
    }
    else
    {
        printf("[%d 번]:[성적: 입력하지 않음]\n", num);
    }
}