컴퓨터/C
지금까지 프로그래밍을 하면서 이상한 점을 느끼셨나요 ? 분명 변수를 선언하고 사용하는데 왜 함수에 매개변수가 있고 반환이 있을까? 바로 변수의 특정 때문에 그렇습니다. 메모리를 조금 더 효율적으로 관리하게 위해서 프로그래밍에서 변수들이 움직일수 있는 범위를 제한해 둡니다. 이런 변수들을 지역변수라고 하고 모든 영역에서 쓸수 있는 변수를 전역 변수라고 부릅니다.
지난 글들에서 소스코드의 범위를 항상 중괄호 { } 로 구분하여 사용하고 있었습니다. 어떤 중괄호 안에 변수가 선언되면 그 부분에서만 사용 할수 있는 변수가 바로 지역 변수입니다.
결국 선언된 시점 부터 포함된 중괄호 { } 가 끝나는 지점에서 해당 지역 변수는 사라집니다.
소스코드를 통해 한번 알아보도록 하겠습니다.
#include <stdio.h>
int main()
{
int number = 10; // main문 안에만 존재할수 있는 지역 변수
while (1)
{
int number2 = 100; // while문 안에만 존재할수 있는 지역 변수
printf("%d\n%d\n", number, number2); // 두개의 변수 다 사용 가능
number++;
number2++;
if (number == 15)
break;
}
//printf("%d\n%d", number, number2); // error발생
return 0;
}
위의 소스코드의 경우 만약 지역변수가 아니라면 반복문 안에서 number2라는 변수가 계속해서 선언 될 것입니다.
이렇다면 동일한 변수명으로 선언을 하려고 하기 때문에 문제가 생깁니다. 같은 변수명이 존재한다면 어떤 것에 값을 넣을지 선택을 하기 힘들기 때문입니다.
또한 선언된 변수가 특정 영역에서만 필요한데 사라지지 않고 계속해서 선언된다면 그 프로그램은 메모리를 사용량이 누적되어 불필요한 변수들이 계속해서 존재 할 것입니다.
하지만 이런 지역변수만 사용한다면 모든 곳에서 공통으로 쓰고 싶은 변수들은 어떻게 해야 될까요?
전역변수는 내가 만든 프로그램 어디에서든 자유롭게 쓸수 있는 변수입니다. 전역변수를 선언하는 방법은 간단합니다 가장 큰 영역에 변수를 선언하면 됩니다. 우리가 작성하는 소스코드에서는 main문이 아닌 그 밖, 즉 아무 중괄호 { } 가 없는 영역에 선언을 하면 됩니다. 그럼 아래 소스코드를 통해 전역변수를 선언하여 써보도록 하겠습니다.
#include <stdio.h>
int g_number = 0; //전역 변수의 선언
void func()
{
g_number++;
return;
}
int main()
{
printf("%d\n", g_number);
g_number++;
printf("%d\n", g_number);
func();
printf("%d\n", g_number);
return 0;
}
g_number라는 전역변수를 선언함으로서 소스코드의 어떤 영역에서도 사용할수 있게 됬습니다. 이런식으로 전역변수는 모든 소스코드의 영역에서 사용할 수 있지만 프로그램이 끝날때까지 항상 메모리를 차지하고 있게 될 것입니다. 강력한 기능을 가졌지만 비효율적인 변수인셈입니다.
예제1) 지역변수와 글로벌 변수의 이름이 같다면 ?
#include <stdio.h>
int g_number = 0; //전역 변수의 선언
void func()
{
g_number++;
return;
}
int main()
{
int g_number = 100;
printf("%d\n", g_number);
g_number++;
printf("%d\n", g_number);
func();
printf("%d\n", g_number);
return 0;
}
지역변수와 전역변수는 이름을 똑같이 선언할 수 있습니다. 하지만 동일한 이름이 있다면 우선순위는 지역변수가 높습니다.
위의 소스코드를 보면 전역변수 g_number와 main함수안에 지역변수 g_number가 각각 선언되었습니다.
main문 안에서 g_number는 지역변수를 활용하여 사용합니다. 하지만 지역변수가 속하지 않은 함수 func에서는 전역변수 g_number를 사용합니다. 이처럼 지역변수와 전역변수를 잘 구분하여 활용 해야 됩니다.
예제2) 지역변수의 특성을 사용한 for문
#include <stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n",i);
}
printf("%d\n", i);
for (int j = 0; j < 10; j++)
{
printf("%d\n", j);
}
//printf("%d\n", j); // error 발생
return 0;
}
for문 처럼 초기식에 들어가는 변수를 for문이 끝나고 나서도 사용하고 싶다면 for문의 밖에서 변수를 선언한 다음 사용해야 됩니다.
예제3) 지역변수는 함수의 매개변수로 갈때 복사만 된다.
#include <stdio.h>
void func(int num)
{
num = num * 2;
printf("함수 안으로 온 매개변수는 함수의 지역변수 입니다. 값 : %d\n", num);
return;
}
int main()
{
int num = 10;
printf("main함수 안의 지역변수 num : %d\n", num);
func(num);
printf("func끝난 후 main함수 안의 지역변수 num : %d\n", num);
return 0;
}
결과 보기
변수의 특성을 이해 했다면 결과를 예상해 볼수 있을 겁니다 직접 생각해보고 확인해 보세요 !
C 언어 - 메모리주소 (0) | 2021.06.12 |
---|---|
C 언어 - 배열과 문자열 (0) | 2021.06.09 |
C 언어 - 용어 알아보기 (0) | 2021.06.08 |
C 언어 - 함수 (0) | 2021.06.06 |
C 언어 - 제어문 break / continue / return (0) | 2021.06.05 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet