About C – “지역 변수, 전역 변수, 기억 클래스”
About C – “지역 변수, 전역 변수, 기억 클래스”
10월 1, 2021
지역 변수, 전역 변수
- 지역 변수란, 해당 함수나 블록 내에서 사용할 수 있는 변수입니다.
- 전역 변수란, 소스 전체에서 사용할 수 있는 변수입니다.
- 함수나 블록 안에서 변수를 선언하면 지역 변수가 됩니다.
- 함수 밖에서 선언하면 전역 변수가 됩니다.
#include <stdio.h>
int main(void)
{
int a = 5;
printf("블록 밖의 a=%d\n",a);
{
int a = 100;
a = a + 100;
printf("블록 안의 a=%d\n",a);
}
a = a + 5; // 과연?
printf("블록 밖의, 연산 후의 a=%d\n",a);
return 0;
}
/* 블록 밖의 a=5
블록 안의 a=200
블록 밖의, 연산 후의 a=10 */
코드를 실행해 보면, 블록 안의 a와 밖의 a가 구별되는 것을 알 수 있습니다. 블럭 밖의 a는 전역 변수이고, 블럭 안에 있는 a는 지역 변수입니다.
자료형, 기억 클래스
- 변수 선언시에 이용하는 예약어와 선언된 위치에 따라 기억 클래스가 결정됩니다.
- 변수의 값이 어떤 종류의 메모리에 저장되는지를 결정합니다.
- 자료형은 자료의 크기를, 기억 클래스는 자료의 기억 위치를 결정하는 것입니다.
기억 클래스 – auto(자동)
- auto 기억 클래스는 가장 많이 사용하는 기억 클래스입니다.
- 기억 클래스가 명시되지 않고 선언된 변수는 모두 자동 변수입니다.
- 함수 또는 블록의 내부에서 선언합니다.
- stack 공간을 일시적으로 사용합니다.
- 함수나 블록을 진입하면 기억 영역이 확보되고, 벗어나면 바로 소거됩니다.
- 단, return 문으로 리턴된 값은 스택에 복사되어 외부로 전달됩니다.
- 초기화는 실행시 이루어지며, 초기화하지 않으면 – 임의의 값을 가집니다.
아래의 예제를 살펴봅시다.
#include <stdio.h>
int main()
{ //main 함수 블록 시작
auto int a = 1;
{ // 첫 번째 블록 시작
int a = 2;
{ // 두 번째 블록 시작
int a = 3;
printf("%d\n",a);
} // 두 번째 블록 끝
printf("%d\n",a);
} // 첫 번째 블록 끝
printf("%d\n",a);
return 0;
} // main 함수 블록 끝
일단, 세 개의 printf함수가 있고 모두 a를 출력하도록 되어 있습니다. auto 기억 클래스는 블록을 벗어나면 바로 소거됩니다. 결과는 3 -> 2 -> 1 이 되겠지요.
기억 클래스 – register(레지스터)
- 레지스터란 CPU가 연산 시에 데이터를 임시로 저장하는 데 사용되는 작고 빠른 기억 장소입니다.
- 변수를 선언할 때 자료형 앞에 register로 선언하면 됩니다.
- 4바이트의 데이터만 저장이 가능합니다.
- 두 개까지만 선언할 수 있고, 초과된 변수는 auto로 저장됩니다.
- 레지스터에는 주소가 없으므로 주소 참조가 불가능합니다.
- 컴파일러가 최적화 과정에서 적절한 변수를 레지스터 변수로 만들기 때문에, 일부러 지정할 필요는 없습니다.
기억 클래스 – static(정적)
static int a;
처럼 자료형 앞에 static을 쓰면 선언할 수 있습니다.- 프로그램이 종료될 때까지 값을 유지합니다.
- 처음 실행 시, 한 번만 초기화되고 초기화 값이 없으면 0으로 초기화됩니다.
- 스택이 아닌 정적 데이터 영역을 사용합니다.
- 지역 static변수는 해당 블록 내에서만 접근이 가능합니다.
- 보통 전역 변수 – 소스 전체에서 사용할 수 있는 변수는 기본적으로 static이 되므로, 굳이 static 키워드를 사용하지 않아도 됩니다.
기억 클래스 – extern
- 전역 변수는 함수 외부에 선언되는 변수이며 ,프로그램의 모든 부분에서 사용할 수 있습니다.
- 전역 변수는 자료형 앞에 extern을 붙임으로서 사용할 수 있습니다.
extern int a;
처럼 선언된 extern변수는 해당 파일에서 실제로 있는 변수가 아니라 프로그램의 다른 파일에 선언된 변수인데도, 해당 파일에 사용할 수 있도록 합니다.
제가 이해한 C언어의 기억 클래스 정리입니다.