아시는 것처럼 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); } }