ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 33. 정적변수 - C 언어
    CSE/C Language 2015. 7. 19. 15:08

    1. 정적변수의 특징

     1) 정적변수가 함수의 내부에서 선언되면 내부 정적변수이고 외부에서 선언되면 외부 정적변이다.


     2) 정적변수는 프로그램이 종료될 때까지 생존한다. 즉, 메모리에서 사라지지 않는다.


     3) 정적변수는 초기화를 하면 프로그램이 실행될 때 초기화 값으로 딱 한번 초기화된다.


     4) 정적변수는 초기화하지 않으면 무조건 0이나 널로 초기화된다.


     5) 정적변수는 지역변수와 달리 정적 데이터 영역에 저장된다.(스택에 저장되지 않는다)


     6) 내부 정적변수는 변수가 선언된 함수 안에서만 유효하다(다른 함수나 파일에서는 내부 정적변수의 존재를 알지 못하므로 사용될 수 없다.)


     7) 외부 정적변수는 변수가 선언된 그 아래에 있는 모든 함수에서 사용될 수 있다(다른 파일에서는 외부 정적변수의 존재를 알지 못하므로 사용될 수 없다)



     딱 한가지만 제외하면 전역변수와 정적변수의 특징은 동일하다. 전역변수는 선언된 곳뿐만 아니라 다른 모든 함수나 파일에서도 사용할 수 있지만, 정적변수는 선언된 파일에서만 사용할 수 있다는 것이 유일한 차이점이다. 즉, 내부 정적변수는 변수 사용이 함수 내부로 국한되며 외부 정적변수는 선언된 그 아래에 있는 함수에서만 사용할 수 있다.





    2. 내부 정적변수

     내부 정적변수의 특징은 아래와 같다. 


     1) 내부 정적변수는 함수 내부에서 선언한다.


     2) 내부 정적변수는 함수 내부에서만 사용할 수 있으며 다른 함수나 파일에서는 내부 정적 변수의 존재를 알지 못하므로 사용할 수 없다. 


     3) 내부 정적변수는 프로그램이 종료되지 않는 한 생존한다.


     4) 내부 정적변수는 초기화 값을 지정하면 프로그램이 실행될 때 딱 한번 초기화된다.


     5) 내부 정적변수는 초기화 값을 지정하지 않으면 프로그램이 실행될 때 0 이나 널로 초기화된다.


     6) 내부 정적변수는 스택이 아닌 정적 데이터 영역에 저장된다.


     

     아래는 내부 정적변수의 사용 예제이다.



    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
     
    /*
     * static.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void sub_func();
     
    int main(void) {
     
        sub_func();
        sub_func();
        sub_func();
     
        return 0;
    }
     
    void sub_func() {
     
        static int count = 0;
        int total = 0;
     
        count++;
        total++;
     
        printf("count = %d, total = %d\n", count, total);
    }
     
    cs














    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
     
    /*
     * static.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int sub_total(int);
     
    int main(void) {
     
        int i, result;
     
        for (i = 1; i <= 100; i++)
            result = sub_total(i);
     
        printf("result = %d\n", result);
     
        return 0;
    }
     
    int sub_total(int count) {
        static int total;
        int i;
     
        for (i = 0; i < count; i++)
            total += i;
     
        return total;
    }
     
    cs








     왜 내부 정적변수를 사용하는가?


    지역변수는 함수의 실행이 종료될 때 생을 마감한다. 하지만 함수가 종료되더라도 특정한 변수의 값을 변경하고 싶지 않다거나 함수가 호출될 때마다 지정한 변수의 값을 누적하고 싶다면 정적변수는 좋은 대안이 된다. 또한, 함수안에서만 사용되고 다시 초기화할 필요가 없는 변수는 내부 정적변수로 사용하면 실행될 때 한번만 초기화되기 때문에 실행속도 면에서도 훨씬 우위에 선다. 즉, 함수를 호출하더라도 변수의 값을 변경되지 않고 이전의 값을 그대로 유지하고 싶은 경우에 내부 정적변수를 사용한다. 전역변수로도 이러한 것이 가능하지만 전역변수는 다른 파일에서도 참조 가능하기 때문에 위험하다. 내부 정적변수를 사용함으로써 전역변수의 특징을 그대로 유지한 채 다른 파일에는 변수의 존재를 알리지 않으므로 관리의 용이함과 변수의 안전성을 보장받는다.







    3. 외부 정적변수

     외부 정적변수는 변수의 선언 위치가 함수의 외부에 있기 때문에 붙여진 이름이다. 외부 정적변수를 능숙하게 다루기 위해서는 상당한 시간과 노력이 요구된다. 개념이 어렵다기보다는 손이 잘 가지 않는 변수이기 때문이다.



     외부 정적변수의 특징은 아래와 같다.


      1) 외부 정적변수는 함수 외부에서 선언된다.


      2) 외부 정적변수는 함수가 선언된 그 아래의 모든 함수에서 사용할 수 있지만 다른 파일에서는 사용될 수 없다.


      3) 외부 정적변수는 프로그램이 종료되지 않는 한 생존한다.


      4) 외부 정적변수는 초기화 값을 지정하면 프로그램이 실행될 때 딱 한번 초기화된다.


      5) 외부 정적변수는 초기화 값을 지정하지 않으면 프로그램이 실행될 때 0 이나 널로 초기화된다.


      6) 외부 정적변수는 스택이 아닌 정적 데이터 영역에 저장된다.



     아래는 외부 정적 변수의 사용 예이다.



    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    /*
     * static.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    void one_func();
    void two_func();
    void three_func();
     
    int main(void) {
     
        one_func();
        two_func();
        three_func();
     
        return 0;
    }
     
    void one_func() {
        puts("One Function");
    //    result += 10; // 에러를 유발하는 코드이다.
    //    printf("result = %d\n", result);  // 이 코드 또한 result에 접근이 불가하므로 에러를 유발한다.
    }
     
    static int result;
     
    void two_func() {
        puts("Two Function");
        result += 10;
        printf("result = %d\n", result);
    }
     
    void three_func() {
        puts("Three Function");
        result += 20;
        printf("result = %d\n", result);
     
    }
     
    cs














     왜 외부 정적변수를 사용하는가?


    어떤 프로그래머가 communicate.c 라는 파일을 작성하고 있다. 이 파일 안에는 10 여 개의 함수가 존재하며 10 여 개의 함수에서 공용으로 사용되는 하나의 변수가 필요하다. 그런데 이 변수를 전역변수로 선언하면 현재 작성하고 있는 communicate.c 파일말고도 다른 파일에서도 사용하겠다는 의미가 되므로 10 여 개의 함수 안에서만 사용하려는 프로그래머의 의도는 어긋난다. 그렇다고 함수를 넘길 때마다 값을 전달하기는 상당히 번거로울 것이다. 이때 사용되는 변수가 바로 외부 정적변수이다.


    외부 정적변수는 현재 작성하고 있는 파일의 모든 함수에서 사용할 수 있도록 하고, 다른 파일에서는 변수의 존재를 알리고 싶지 않을 때 유용하다.


    전역변수는 논리적인 에러가 발생했을 때 전역변수를 사용한 모든 곳을 추적해 봐야 하지만 외부 정적변수를 사용하면 단지 외부 정적변수가 선언된 파일 안에서만 에러를 추적하면 되므로 버그를 잡거나 관리하는 데 용이하다.




    댓글

Designed by Tistory.