생존 시간에 따라서 변수를 분류하면


정적 할당 : 프로그램이 실행되는 동안에는 게속 하여서 변수에 저장 공간이 할당 되어있는 방법.


자동 할당 : 블록이 시작되면서 변수에 저장 공간이 할당되고 블록이 종료되면 저장 공간이 회수되는 방법.


으로 나눌수 있습니다.

이러한 변수의 생존 시간은


1. 변수가 선언되는 위치 : 전역 변수는 정적할당, 지연변수는 기본적으로 자동 할당, 그러나 지역 변수 앞에 저장 유형 지정자를 붙이면 정적 할당으로 변경가능.


2. 저장 유형 지정자 : 변수를 선언할 때 앞에 저장 유형을 지정하는 수식어를 뜻한다. 이들 수식어들을 붙이면 변수의 저장 유형을 프로그래머가 지정할수 있다. 

ex) auto, static, register, extern 등





auto 지정자


함수나 블록 내에 선언되는 지역 변수는 기본적으로 자동 할당입니다. 원칙적으로는 앞에 auto를 붙여허 auto int i = 0; 이런식으로 넣어줘야하지만, 

int i = 0 ; 이렇게 해도 자동 변수입니다.




static지정자


블록을 벗어나도 자동으로 제거되지 않는 변수를 뜻합니다.

static int i = 0; 이렇게 선언을 하면 해당 블록을 벗어나도 변수가 사라지지않습니다. 이는 지역 변수를 정적 변수로 바꿔주는 static 지정자를 사용하였기 때문입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void sub()
{
    static int scount = 0// 이전값이 유지되면서 증가한다.
    int acount = 0//sub함수가 종료되면 자동으로 소멸.
    printf("scount=%d\t", scount);
    printf("acount=%d\n", acount);
    scount++;
    acount++;
}
 
int main()
{
    sub();
    sub();
    sub();
    return 0;
}
cs

실행 결과(count)실행 결과

scount는 static지정자를 사용하여서 정적 변수로 만들어줬고, acount는 일반 auto형식의 지역 변수로 만들어졌습니다. 정상적이라면 main함수에서 sub()를 호출할 때 마다 초기화가 되어야하지만 scount는 그렇지 않습니다. 기존에 scount를 ++시킨게 저장이되서 중첩되는것을 확인할수가 있습니다.





예제 1. 은행 계좌 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//은행 계좌 구현하기
 
#include <stdio.h>
 
void save(int amount);
int main()
{
 
    printf("=============================\n");
    printf("입금 \t출금\t잔고\n");
    printf("=============================\n");
    save(10000);
    save(50000);
    save(-10000);
    save(30000);
    printf("=============================\n");
    return 0;
}
 
void save(int amount)
{
    static long balance = 0;
 
    if (amount >= 0 )
    {
        printf("%d \t\t", amount);
    }
    else
    {
        printf("\t %d \t"-amount);
    }
 
    balance += amount;
    printf("%d \n", balance);
}
cs

실행 결과(은행)실행 결과

static지정자를 사용해서 함수가 종료되어도 balance의 값은 유지가 되게 만들어서 잔고를 저장하는 프로그램입니다. 10000의 인수를 amount라는 매개변수로 이동시켜서 연산을 실행시킨후, static long balance에 저장하였습니다.



2. 한번만 초기화 하기

네트워크 초기화를 처음 1번만 실행하게 하는 예제입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//한번만 초기화하기 (static 사용)
 
 
#include <stdio.h>
#include <stdlib.h>
 
void init();
 
int main()
{
    init();
    init();
    init();
    return 0;
}
 
void init()
{
    static int inited = 0// static 함수 사용, 변수가 초기화되지 않는다.
    if (inited==0)
    {
        printf("init (): 네트워트 장치를 초기화합니다.\n");
        inited = 1;
    }
    else
    {
        printf("init (): 이미 초기화 되었으므로 초기화하지 않습니다.\n");
    }
}
cs

한번 초기화된 네트워크는 static int inited를 통하여 0으로 바뀌어있으므로 더이상 초기화를 실행하지 않습니다.