(C/C++) 참고용 정리 - 전역 변수 vs 지역 변수 vs static 변수

  • 전역 변수(Global Variable)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>

    int var = 3; // 전역변수

    void add() {
    var++; // 어디서나 접근 가능
    printf("%d\n", var); // 4
    }

    int main() {
    add();
    printf("%d", var); // 4, 값의 유지
    return 0;
    }
  1. 값의 유지
  2. 어디에서든 접근 가능
  3. main 함수 실행 전에, 프로그램이 실행되자 마자 메모리에 할당됨.
  4. 프로그램이 끝나는 순간 메모리에서 해제됨.
  5. 메모리의 Data 영역에 적재됨.
     
    2번의 이유로 인해서 변수의 스코프가 더럽혀진다.
    더럽혀진다는 의미는 변수 이름의 충돌 가능성이 존재하고,
    그로 인해 변수 이름 짓기에 큰 시간을 할애해야 하며,
    변수의 이름이 길어지거나 이상해지는 경우도 존재한다.
    어디서나 접근 가능하기 때문에 실수로 변수의 값이 바뀔 가능성이 존재한다.
    뭐 그렇다고 해서 꼭 안 좋은 것만은 아니기 때문에 적절히 활용하면 된다.
  • 지역 변수(Local Variable)
    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
    #include <stdio.h>

    int var = 3; // 전역변수

    void add() {
    int var = 4;
    var++;
    // 지역 변수의 우선순위가 전역 변수보다 높음.
    printf("%d\n", var); // 5
    }

    int main() {
    { // block scope
    int asdf = 33;
    printf("%d", asdf);
    }
    // printf("%d", asdf); // 스코프를 벗어나서 컴파일 오류가 남.
    add();
    printf("%d\n", var); // 3, 값의 유지가 안 됨.
    int i = 0;
    // 지역 변수 i의 scope 시작
    for(int i=0; i<3; i++) {
    printf("%d ", i); // 0 1 2
    }
    // 지역 변수 i의 scope 끝
    printf("\n%d", i); // 0, 여기서 나온 건 전역 변수 i
    return 0;
    }
  1. 매번 새로운 값 생성, 값의 유지가 안 됨.
  2. 지정된 블록 스코프(제어문, 함수 등등)에서만 접근 가능
  3. 함수가 실행되는 순간마다 메모리에 할당됨.
  4. 함수가 종료되는 순간마다 메모리에서 해제됨.
  5. 메모리의 Stack 영역에 적재됨.
     
    값이 유지되지 않기 때문에 함수를 실행할 때마다 매번 똑같은 값을 써야할 때 쓴다.
    스코프 내에서만 접근 가능하기 때문에 유지보수에 용이하다.
    가능하면 스코프의 범위는 좁은 게 유지보수하기 편하다고 들었다.
  • static 변수
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>

    void add() {
    static int var = 4;
    var++;
    printf("%d\n", var);
    }

    int main() {
    add(); // 5
    add(); // 6
    return 0;
    }
  1. 값의 유지
  2. 지정된 블록 스코프(제어문, 함수 등등)에서만 접근 가능
  3. main 함수 실행 전에, 프로그램이 실행되자 마자 메모리에 할당됨.
  4. 프로그램이 끝나는 순간 메모리에서 해제됨.
  5. 메모리의 Data 영역에 적재됨.
     
    값이 유지돼야 하지만, 유지보수 등등 때문에 전역변수도, 지역변수도 마땅치 않을 때가 있다.
    이럴 때 쓰는 게 static 변수이다.
    값이 유지 된다는 전역 변수의 특징과 지정된 스코프에서만 접근 가능하다는 지역 변수가 짬뽕된 케이스이다.