(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 영역에 적재됨.
    &nbsp;
    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 영역에 적재됨.
    &nbsp;
    값이 유지되지 않기 때문에 함수를 실행할 때마다 매번 똑같은 값을 써야할 때 쓴다.
    스코프 내에서만 접근 가능하기 때문에 유지보수에 용이하다.
    가능하면 스코프의 범위는 좁은 게 유지보수하기 편하다고 들었다.
  • 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 영역에 적재됨.
    &nbsp;
    값이 유지돼야 하지만, 유지보수 등등 때문에 전역변수도, 지역변수도 마땅치 않을 때가 있다.
    이럴 때 쓰는 게 static 변수이다.
    값이 유지 된다는 전역 변수의 특징과 지정된 스코프에서만 접근 가능하다는 지역 변수가 짬뽕된 케이스이다.