728x90
반응형
프로그래밍 수업을 할 때 학생들이 지역/전역 변수를 헷갈려해 아래와 같은 코드를 두고, 왜 오류가 나는지 묻는 경우가 있습니다.. 그래서 이 내용에 대해 정리를 좀 해두려고 합니다.
아마 main() 함수 안에 정의한 a, b를 당연히 sum() 함수에서 쓸 수 있다고 생각하는 거 같습니다. ㅜㅜ
#include <stdio.h>
int sum(int p, int q)
{
return a + b + p + q;
}
int main()
{
int a = 10;
int b = 20;
int c = 100;
int d = 200;
printf("%d", sum(c, d));
return 0;
}
C언어의 변수에는 지역 변수, 전역 변수, 그리고 외부 변수로 크게 3가지로 나눌 수 있습니다.
(정적, 레지스터 변수로도 나눌 수 있는데, 이는 다음 피드에서 설명할게요.)
1. 지역 변수(local variable)
해당 함수 또는 블록 내에서 사용하는 변수
함수 또는 블록을 벗어나면 변수의 메모리 공간이 소멸되어 사용할 수 없게 됩니다.
위 코드에선 main 함수 내에서만 쓸 수 있는 지역 변수 a, b, c, d가 있고,
sum 함수에 선언된 p, q가 또 다른 지역 변수입니다.
따라서, sum 함수 내부에서 a, b 변수는 사용이 불가능합니다.
2. 전역 변수(global variable)
지역 변수와 대비되는 개념의 변수
함수나 블록 외부에 선언되어 프로그램 전체에서 사용 가능합니다.
C언어에서는 프로그램을 딱 실행시키면 main() 함수를 찾습니다.
하지만, 전역 변수는 main() 함수가 실행되기 전에 자동 생성되어 초기화됩니다. 즉, 프로그램 시작 시점에 생성되고 프로그램 종료 시점에 소멸되는 변수입니다.
전역 변수는 모든 곳에서 접근이 가능하고, 프로그램 종료 전엔 메모리가 소멸되지 않는다는 장점이 있지만 잘 못 사용하거나 남용할 경우 관리가 어려워질 수 도 있습니다. (유지보수 또는 변수 이름 중복 등)
위의 코드가 정상적으로 돌아가도록, 변수 a, b를 전역 변수로 선언해보겠습니다.
#include <stdio.h>
int a = 10;
int b = 20;
int sum(int p, int q)
{
return a + b + p + q;
}
int main()
{
int c = 100;
int d = 200;
printf("%d", sum(c, d));
return 0;
}
지역 변수와 전역 변수를 잘 이해할 수 있는 또 다른 예제를 들어볼게요.
#include <stdio.h>
int global_num = 100;
int add(int local_num)
{
return local_num + global_num;
}
int main()
{
int local_num = 80;
int global_num = 20;
printf("main 함수 내부 sum : %d\n", local_num + global_num);
printf("main 함수 외부 sum : %d\n", add(local_num));
return 0;
}
위의 코드엔 global_num이라는 변수가 두개 있지만, 서로 다른 변수인 것을 인지해야 합니다.
따라서 main() 함수 내부에서 local_num + global_num 을 계산할 땐, 20의 값을 가진 변수가 사용되지만,
add() 함수 입장에선, main() 함수 내부에 있는 global_num 변수는 접근할 수도, 그 값이 있는지도 모릅니다.
그렇기 때문에 전역 변수로 선언한 global_num을 사용하여 덧셈하고, 값을 리턴 시켜줍니다.
3. 외부 변수(external variable)
다른 소스코드 파일에 선언된 전역 변수를 사용하고자 하는 경우에 사용
extern 키워드를 사용하여 다른 소스코드 파일에서 선언된 전역 변수를 사용하게 됩니다.
두 소스파일 (main.c와 global.c)을 사용하고,
main.c 파일에서 global.c 파일에 선언된 전역 변수를 사용하는 코드입니다.
extern 키워드를 사용하여, num_1과 num_2 변수에 접근하고 있습니다.
이렇게해서 C언어의 지역, 전역, 외부 변수를 알아보았습니다.
반응형
'C Programming' 카테고리의 다른 글
동적 메모리 할당을 통해 배열처럼 사용하기(mallloc(), calloc()) - 공부하는 도비 (0) | 2022.11.06 |
---|---|
C언어 레지스터 변수 - 공부하는 도비 (0) | 2022.11.06 |
C언어 피보나치 수열 출력하기 - 공부하는 도비 (0) | 2022.10.31 |
C언어 재귀 함수를 사용한 피보나치 수열 - 공부하는 도비 (0) | 2022.10.28 |
C언어 재귀함수를 사용한 합 구하기 - 공부하는 도비 (0) | 2022.10.28 |