유효범위

유효범위의 정의

  • scope
  • 변수나 함수 등의 식별자가 유효하게 참조될 수 있는 영역
  • 즉, 정의된 변수나 함수가 호출될 수 있는 영역

유효범위의 종류

종류 설명
지역변수 블록이나 함수의 내부에서 선언된 변수
전역변수 함수의 외부에서 선언된 변수

지역변수와 전역변수

정의

  • local variable
  • 특정 범위(블록이나 함수 등) 내에서만 통용되는 변수
  • 블록이나 함수 내부에 선언된 변수들이 지역변수에 해당함
  • 함수 헤더이 선언된 형식 매개변수 또한 지역변수이다.
  • 자신이 선언된 블록이나 함수 내에서만 사용할 수 있다.
  • 명시적으로 초기화되지 않으면 쓰레기 값으로 초기화된다.

쓰레기 값
해당 변수가 선언된 메모리 공간이 이전에 사용되었을 때 저장되었던, 남아있는 값.

지역변수

  • local variable
  • 특정 범위(블록이나 함수 등) 내에서만 통용되는 변수
  • 블록이나 함수 내부에 선언된 변수들이 지역변수에 해당한다.
  • 함수 헤더에 선언된 형식 매개변수 또한 포함된다.
  • 지역변수는 자신이 선언된 블록이나 함수 내에서만 사용할 수 있다.
  • 명시적으로 초기화하지 않는 경우, 쓰레기 값으로 초기화된다.

쓰레기 값
해당 변수가 선언된 메모리 공간이 이전에 사용되었을 때의 값이 남아있는 경우를 의미한다.

전역변수

  • global variable
  • 프로그램 전체에 걸쳐서 사용될 수 있는 변수이다.
  • 함수 외부에 선언된 변수, 또는 #include 로 포함시킨 외부 파일에 선언된 변수이다.
  • 해당 파일, 또는 해당 파일을 포함하는 다른 파일에서 사용할 수 있다.
  • 명시적으로 값을 초기화하지 않는 경우, 0으로 초기화된다.
  • 전역변수는 프로그램 선두에 선언하는 것을 권장한다.

변수 가림 현상

  • shadowing
  • 동일한 이름을 갖는 여러 변수가 있는 경우, 가장 안쪽 블록에 선언된 지역변수가 우선된다.
  • 따라서, 헷갈림을 최소화 하기 위해 전역변수는 프로그램 선두에 선언하는 것을 권장한다.
1
2
3
4
5
6
7
8
int a = 1;
int main() {
    int a = 10;
    {
        int a = 30;
        printf("a = %d\n", a);
    }
}
1
a = 30

지역변수 사용 권장

  • 가급적 지역변수를 사용하는 것이 권장된다.
지역변수 사용 장점 설명
함수의 독립성 향상 함수 외부의 값에 의존하지 않으므로, 함수의 독립성이 향상된다.
의도적으로 전역변수를 사용하는 경우는 제외
디버깅 용이 함수 내부에서 발생한 문제를 쉽게 추적할 수 있다.
기억공간 절약 지역변수는 사용된 후 scope 를 벗어나면 바로 메모리에서 제거된다.
재귀호출 함수 작성 전역변수를 재귀호출 구조에서 사용할 경우, 값이 누적되며 의도와 달라질 수 있다.
반면 재귀호출 구조에서 지역변수는 항상 초기화되므로, 의도된대로 움직인다.

코드로 보는 지역변수와 전역변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int a; //----------------- a : 전역변수  
void func(int b) { // ---- b : 형식 매개변수(지역변수)
    int c; // ------------ c : 지역변수
    expressions_1; // ---- a, b, c 사용 가능
    {
        double d; // ------ d : 지역변수 (코드블럭 내)
        expressions_2; // - a, b, c, d 사용 가능
    }
    expressions_1; // ---- a, b, c 사용 가능
}

double e; //-------------- e : 전역변수
int main() {
    int a, f; // --------- a, f : 지역변수
              // 여기서의 a는 지역변수이며, 전역변수 a와는 다른 변수이다.
    expressions_3; // ---- a, e, f 사용 가능
}

예시

지역변수의 사용 예시 1

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
void func();
int main() {
    int i = 10;
    printf("(1) main i = %d\n", i);
    func();
    printf("(3) main i = %d\n", i);
}
void func() {
    int i;
    i = 20;
    printf("(2) func i = %d\n", i);
}
1
2
3
(1) main i = 10
(2) func i = 20
(3) main i = 10

지역변수의 사용 예시 2

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() { // block A : main 함수
    int x = 2, y = 4;
    printf("block A : x = %d, y = %d\n", x, y);
    {  // block B : 중괄호로 둘러싸인 블록
        int x = 5;
        y ++;
        printf("block B : x = %d, y = %d\n", x, y);
    }
    printf("block A : x = %d, y = %d\n", x, y);
}
1
2
3
block A : x = 2, y = 4
block B : x = 5, y = 5
block A : x = 2, y = 5

전역변수의 사용 예시

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
voud func();
int x; // 전역변수 - 초기화 생략 -> 0으로 초기화  
int main() {
    printf(" 1 : x = %d\n", x);
    func();
    printf(" 2 : x = %d\n", x);
}
void func() { // 형식매개변수는 없다 = 외부에서 매개변수를 받지 않음
    x++; // ---- x 는 전역변수이므로 어디에서든 쓰일 수 있다.  
}
1
2
1 : x = 0 #---- 초기화된 값
2 : x = 1 #---- func() 호출 후 x 값이 증가

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments