[C] 지역변수와 전역변수(+ extern, static, const)

2021. 1. 5. 13:18프로그래밍 공부/C 공부

[지역변수]

C언어에서 하나의 함수, 즉 {} 안에 선언된 변수를 의미한다.

지역변수는 해당 함수안에서만 유효하다.

main 함수 안에 선언된 a 변수가 그 예이다.

void main()
{ int a = 0 ; }

- 특징

지역변수는 서로다른 함수들끼리 이름을 중복하여 사용할 수 있다.

 

[전역변수]

C언어에서 함수에 선언되지 않고 헤더라인쪽에 선언된 변수를 의미한다. 

아래의 변수 a가 그 예이다.

#include <stdio.h>

int a = 0;

void main() {....}

-특징 

전역변수와 동일한 이름으로 지역변수로 재정의한경우 : 이름이 같을때 지역변수가 먼저 처리되므로 var1 + var2 값은 지역변수 result에 저장되고, 전역변수 result에는 어떤 변화도 생기지 않는다. main은 전역변수 result를 출력하므로 결과값은 0이 나오게된다.

#include <stdio.h>
int result = 0;  // (1)전역변수 생성

void Sum(int var1, int var2);  // (2)Sum함수 선언

void main() 
{
	Sum(5, 3); //(3)Sum함수 호출
	printf("%d", result);  // (5)결과값은 무조건 0 출력
}

void Sum(int var1, int var2)
{
	int result;  // (4)Sum함수 result 재정의(지역변수화)
	result = var1 + var2;
}

이러한 특징때문에 지역변수는 프로그램의 이식성을 떨어트리므로 꼭 필요한 경우가 아니면 사용하지 않는게 좋다.

 

[extern 키워드:전역변수 참조]

같은 프로젝트안에 있는 전역변수를 참조하도록 해주는 키워드이다. 전역변수가 선언되지 않은 소스코드에서 전역변수가 필요할때 사용된다.

 

sum.c 에 전역변수 reult 가 선언된 상태에서 main.c 에서는 해당 전역변수를 참조해야할때 아래와 같이 사용한다.

//..... 

extern int result ;

void main () {...}

[static 키워드:전역변수 사용범위 제한]

C에서 전역변수의 사용범위는 프로그램 전체이다. 이러한 이유로 다른 사람의 라이브러리를 가져와서 사용할때 오류가 발생하기도 하는데, 이 범위를 제한함으로써 오류를 방지할 수 있다.

 

sum.c 의 전역변수 result를 static int result ; 로 선언하면 main.c 에서 result로 전역변수를 만들더라도 링크할때 아무런 오류가 발생하지 않는다. sum에서 선언된 전역변수 result의 사용범위는 sum.c 소스코드로 한정되었기 때문이다.

 

static으로 제한된 전역변수는 extern으로도 참조되지 않는다.

 

또한 지역변수에 static을 활용할 수 있는데

# include <stdio.h>

void tmp() 
{
	static int bin = 0;
    printf("%d\n",bin++);
}

void main()
{
	int i;
    for(i=0 ; i <=5 ; i++){tmp()};
}

이 코드에서 tmp 함수 bin변수에 static이 없으면 출력값은 항상 0이 되었을 것이다. 

하지만 static으로 지역변수를 전역변수화 시켰고 자신이 가지고 있는 값을 유지하게 되어 1,2,3,4,5를 출력하게 된다.

 

[const 키워드 : 이 변수는 건드리지마]

특정 변수를 상수로 인식시켜 시켜 변경할 경우 문법 오류가 나타나도록 하는 키워드

컴파일할때 문법적 오류를 알려주기 위한 기능으로 변수의 속성 자체를 바꾸는 것은 아님

//.......

int GetArea(const double pi, double radius, int limit)
{
double result ;
pi = 3.14;
result = pi * radius * radius;
return result;

}

이 예시에서 pi 값은 변경하면 안되지만 누군가 실수로 변경할 수 있으므로, pi값이 변경되면 오류가 나도록하는 const 키워드를 변수에 추가하였음.

 

'프로그래밍 공부 > C 공부' 카테고리의 다른 글

[C] void 포인터  (0) 2021.01.06
[C] 포인터 활용  (0) 2021.01.06
[C] 포인터 개념  (0) 2021.01.06
[C] if 조건문  (0) 2021.01.05
[C] 저장공간 할당  (0) 2021.01.05