정적 변수(static variable)
정적 변수는 선언 시 형 앞에 static 이라는 키워드를 사용한다.
ex) static int a = 10;
정적 변수의 초기화는 프로그램 컴파일 시에 단 한 번만 하게 된다.
정적 변수는 함수 내, 외부 모두 선언 가능하다.
어떤 함수의 종료 후에도 그 값이 소멸되지 않고 보관되어, 다시 호출될 때 그 직전의 값을 참조할 수 있다.
ex) #include <stdio.h>
main()
{
int i;
for(i=0; i<5; ++i)
sub1( ) ;
}
sub1( )
{
static int a = 0 ;
a+=10 ;
printf(" a의 값 = %d\n ", a) ;
}
만약 지역 변수였다면 10을 다섯 번 출력했을 것이다. 하지만 정적 변수를 사용해서 초기화를 한 번만 시켜서 0 -> 10 -> 20 -> 30 -> 40 -> 50이 출력된다.
정적 변수를 만들려면 선언과 초기화를 동시에 해 주어야 한다(초기화 안 할 시 자동으로 0으로 초기화). 만약 다른 곳에서 초기화가 된다면 기억된 데이터가 다시 초기화 된다.
함수 내부에서 선언된 정적 변수는 그 함수의 지역 변수가 되기 때문에 다른 함수에서는 참조할 수 없다.
함수 외부에서 선언된 정적 변수는 프로그램 어디에서나 참조가 가능한 전역 변수이며, 정적인 기억 장소에 변수의 값이 저장되어 있으므로 프로그램이 끝날 때까지 보존된다.
외부 변수(external variable)
모듈별 분할 컴파일에 사용되는 변수이다.
소스 밖에서도 사용 가능하고 함수 바깥에서 선언되었다면 어느 곳에서라도 사용 가능한 전역 변수가 된다.
외부 변수는 extern 이라는 키워드를 붙이고 선언을 하는데 이 외부 변수는 선언 이전에 나온 함수에서는 참조할 수 없고 정적 변수처럼 자동으로 0으로 초기화 된다.
ex) extern int a;
소스.c:
extern int a;
void func()
{
a = 50;
}
소스1.c:
#include <stdio.h>
int a;
extern void func();
int main()
{
printf(“a: %d\n”, a);
func();
printf(“a : %d\n”, a);
return 0;
}
이 코드를 실행 하면 결과는
a: 0
a: 50
이렇게 나온다.
소스1.c에서 외부 모듈에서 func란 함수를 찾고, 호출한다.
소스.c에서 a란 변수를 외부 모듈에서 찾고, 그 변수에 50이란 값을 대입한다.
레지스터 변수(register variable)
기억할 데이터의 값을 메모리에 저장하지 않고, 직접 CPU 내부의 레지스터에 기억시키는 변수이다.
반복문인 for문이나 while문 등의 제어 변수를 레지스터에 기억시켜 반복 처리하면 실행 속도를 높일 수 있다.
일반적인 변수는 메모리에 저장된 데이터를 CPU내의 레지스터로 가져와 연산을 하고, 연산 결과를 다시 메모리에 저장하는 방식이다.
레지스터 변수는 직접 레지스터에 값을 저장해 두고 연산을 실행하므로 처리 속도가 매우 빠르다.
일반적으로 레지스터 변수는 3개까지 가능하고, 많이 지정해서 사용하여 가용 레지스터가 없을 때 레지스터 변수는 자동 변수로 할당된다.
레지스터 변수는 선언 시 형 앞에 register 라는 키워드를 사용한다.
ex) register int a;
레지스터 변수의 사용 방법은 자동 변수와 동일하다.
ex) #include <stdio.h>
main()
{
register int i, sum=0 ;
for(i=0; i<=100 ; ++I)
sum += i;
printf(" 1부터 100까지의 합 = %d\n ", sum) ;
}
앞으로 반복문의 제어 변수를 사용할 때 register 변수를 사용해 봐야겠다.
'교과목 > 프로그래밍' 카테고리의 다른 글
프로그래밍 보고서(전처리기, 헤더파일, 기계어, 어셈블리어, 고급 언어, 컴파일 단계) (0) | 2017.11.05 |
---|