ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 32. 전역변수 - C 언어
    CSE/C Language 2015. 7. 19. 14:33

    1. 전역변수의 특징

     1) 함수의 바깥에서 처음 변수를 정의할 때는 기억부류 지정자가 필요하지 않지만 다른 파일의 함수에서 사용할 때는 extern이라는 기억부류 지정자가 필요하다. 즉, 변수에 extern을 앞에 붙이게 되면 다른 파일의 extern으로 선언된 변수를 사용하겠다고 컴파일러에게 알리는 것이다.


     2) 전역변수는 사용자가 초기화를 해주지 않으면 무조건 0이나 널로 초기화된다.


     3) 전역변수는 프로그램이 시작될 때 딱 한번만 초기화되고 더 이상 초기화되지 않는다.


     4) 전역변수는 함수의 외부에서 정의하며 모든 함수, 파일에서 인식하고 처리된다.


     5) 전역변수는 프로그램이 끝날때까지 메모리에서 사라지지 않는다. 프로그램이 실행되는 동안에는 항상 메모리에 상주된다.


     6) 전역변수는 정적 데이터 영역이라는 메모리 위치에 저장된다.





    2. 전역변수의 사용 예

     아래 3개의 소스를 작성하여서 직접 전역변수가 어떻게 사용될 수 있는지 확인해보자.



    extern.c


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




    func_1.c


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /*
     * func_1.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    extern int tmp;
     
    void func_1() {
        tmp += 50;
    }
     
    cs



    func_2.c


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /*
     * func_2.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    extern int tmp;
     
    void func_2() {
        tmp += 25;
    }
     

    cs











    3. 왜 전역변수를 사용하는가?

     전역변수는 정의한 파일 안의 모든 함수뿐만 아니라 다른 모든 파일의 함수에서도 사용 가능하기 때문에 이에 대한 특성을 고려하여 처리하는 프로그램에서 전역변수를 사용한다. 가령 프로그래머가 게임 프로그램을 작성하고 있다고 예상해 보자. 프로그래머는 건물을 파괴할 때마다 게임의 점수를 높이기로 결정하고 여러 도시를 만들었다. A 도시는 건물을 파괴하기 힘들기 때문에 하나의 건물을 파괴할 때는 500점을 주었다. A 도시를 구성하고 처리하는 파일의 이름은 a_city.c 였고 B 도시는 b_city.c로 작성하였다. 게이머가 A 도시에 있는 B도시에 있든 게임점수는 항상 같은 변수에 저장해야 한다. 그렇지 않으면 도시를 이동할 때마다 다른 점수가 출력되기 때문에 문제가 발생한다. 어느 도시를 이동하든지 점수는 이전의 값을 유지해야 하기 때문에 점수를 위한 전역변수가 필요한 것이다. 하지만 이것은 하나의 예일 뿐이고 현업에서도 이와 같은 상황에서는 전역변수를 사용하는 것이 아니라 함수호출 시 인자로 넘기는 방식으로 전역변수의 사용을 피한다. 


     프로그램을 많이 작성해 보지 않은 초보자들은 전역변수를 많이 사용하는 경향이 있다. 전역변수를 사용하면 같은 파일의 다른 함수에서도 이를 사용할 수 있어서 자유롭게 프로그래밍을 할 수 있기 때문이다. 하지만 이는 매우 근시안적인 생각이다. 전역변수의 남용은 프로그램이 커질수록 프로그래머가 당황하게 만들 소지가 아주 많다. 전역변수는 어떤 함수나 파일에서도 사용가능하기 때문에 문제가 발생하면 전역변수가 사용된 모든 파일을 검사해야 하고 이것은 문제점을 해결하는 데 상당한 시간이 소요됨을 의미한다. 그러므로 전역변수는 꼭 필요한 경우가 아니면 자제하는 것이 좋다.


     



    댓글

Designed by Tistory.