함수 안에서만 사용하는 지역 변수와 프로젝트 전체에서 사용하는 전역 변수의 차이를 알아본다.
#include <stdio.h>
int ReturnNum()
{
int num = 5;
return num;
}
void main()
{
ReturnNum();
printf("%d", num);
-> 전형적인 오류 코드의 예시. ReturnNum이라는 함수를 main함수가 호출하지만, ReturnNum 함수에서만 영향을 미치는 num이라는 지역 변수가 main에 선언돼있지 않기 때문에 오류가 발생한다.
따라서 올바른 코드로 고쳐보면, (c.2)
#include <stdio.h>
int ReturnNum()
{
int num = 5;
return num;
}
void main()
{
int r = ReturnNum();
printf("%d", r);
}
이렇게 r이라는 지역 변수 (main함수에서만 작용하는 지역 변수)를 포함하여야 num이 초기화 되어도 r 변수에 값이 저장되므로 오류를 방지할 수 있다.
Q. 지역 변수 이름은 중복해서 사용할 수 있다?
원래는 함수 안에 똑같은 이름의 변수가 있으면 오류로 처리되지만, 서로 다른 함수에 있는 지역 변수의 이름은 같아도 오류로 처리되지 않는다.
지역 변수는 스스로 초기화되지 않기 때문에 필요할 때 프로그래머가 직접 초기화해야 한다.
#include <stdio.h>
int Sum(int data1, int data2) /* 매개변수 data1, data2는 Sum함수의 지역 변수 */
{
int result = data1 + data2; /*Sum함수의 지역 변수 result를 선언한 후 data1+data2값으로 초기화함 */
return result;
}
void main()
{
int result; /*main함수의 result는 Sum함수의 result값과 공유되지 않는다. 서로 다른 지역함수이기 때문에,
그리고 초기화되지 않아서 어떠한 값이 들어있는지 알 수 없음 */
result = Sum(5,3);
printf("5+3=%d\n", result);
}
프로그램 전체 영역에서 사용되므로 똑같은 이름을 가진 전역 변수가 또 있으면 오류 발생. 주의해서 사용 요망
함수의 독립성을 강조하는 C언어의 장점을 퇴색시키므로 꼭 필요한 경우에만 사용한다.
#include <stdio.h>
int result; /*전역 변수. 특별한 초기화 값이 없으면 0으로 초기화됨*/
void Sum(int data1, int data2)
{
result = data1 + data2; /* return 명령으로 값을 반환하지 않아도 전역 변수에 저장된 값을
main함수에서 사용할 수 있음. */
}
void main()
{
Sum(5,3);
printf("5+3=%d\n", result); /* 위의 전역 변수 result값이 그대로 들어감. 범함수 변수 */
/* 전역 변수는 한 번 선언하면 프로그램 전체 영역에서 사용할 수 있기 때문에
Sum함수와 main함수 어디에서든 result 변수를 사용할 수 있다. (값을 공유함) */
}
- 전역 변수는 한 번 선언하면 어떤 함수에서도 사용할 수 있으며, 프로그램 전체에서 값을 공유한다.
따라서, return 명령을 사용하여 Sum 함수 반환값을 넘겨받지 않아도 전역 변수의 값을 공유하여 간단하게 처리할 수 있다.
Q. 전역 변수와 지역 변수의 이름이 같다면?
- 기본적으로 C언어 문법은 전역보다 지역을 우선해서 처리한다.
#include <stdio.h>
int result; /* 전역 변수, 특별한 초기화 값이 없으면 0으로 초기화된다. */
void Sum(int data1, int data2)
{
int result; /* 지역 변수 */
result = data1 + data2; /*지역 변수의 우선순위가 높기 때문에 연산 결과 값은 지역 변수에 저장된다. */
}
void main()
{
Sum(5,3);
printf("5 + 3 = %d\n", result); /* main에 적용되는 result 변수는 전역 변수이므로,
0으로 초기화되었던 전역 변수 result 값을 받으므로 출력값이 0이 된다. */
}