Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어의 지역 변수와 전역 변수 범위(Scope) 규칙 완벽 정리

C 언어에서 범위(scope)는 변수에 접근할 수 있는 프로그램상의 영역을 의미합니다. 변수를 어디에 선언하느냐에 따라 그 변수가 보이는 범위와 생존 기간이 달라지며, 크게 전역 범위지역 범위로 나뉩니다.

전역 범위(Global Scope)

전역 범위는 함수나 블록 바깥쪽에서 선언된 변수가 프로그램이 종료될 때까지 모든 영역에서 접근 가능함을 의미합니다. 즉, 어떤 함수 안에서도 전역 변수를 읽거나 수정할 수 있습니다.

예제

#include<stdio.h>
int c = 30; /* 전역 영역 */
main() {
    int a = 10;
    printf("a=%d, c=%d", a, c);
    fun();
}
fun() {
    printf("c=%d", c);
}

실행 결과

a = 10, c = 30
c = 30

위 예제에서 변수 c는 모든 함수 바깥에서 선언되었기 때문에 main()fun() 두 함수 모두에서 접근할 수 있습니다. 반면 변수 amain() 내부에 선언된 지역 변수이므로 fun()에서는 사용할 수 없습니다.

지역 범위(Local Scope)

지역 범위는 블록(중괄호 { }) 또는 함수 내부에서 선언된 변수가 해당 블록 안에서만 유효하고, 블록 바깥에서는 존재하지 않는 것처럼 취급됨을 의미합니다. 블록의 실행이 끝나면 지역 변수는 메모리에서 사라집니다.

예제

#include<stdio.h>
main() {
    int i = 1; // 지역 범위
    printf("%d", i);
    {
        int j = 2; // 지역 범위
        printf("%d", j);
    }
}

실행 결과

1 2

같은 이름으로 변수를 다시 선언하는 경우

서로 다른 블록에서 같은 이름의 변수를 각각 선언하더라도, 컴파일러는 이들을 서로 다른 변수로 취급합니다.

#include<stdio.h>
main() {
    {
        int i = 1; // 같은 이름의 변수
        printf("%d", i);
    }
    {
        int i = 2; // 같은 이름의 변수
        printf("%d", i);
    }
}

실행 결과

1 2

외부 변수 가리기(Shadowing)

내부 블록에서 외부 블록과 같은 이름의 변수를 다시 선언하면, 내부 블록이 실행되는 동안 외부 블록의 변수가 일시적으로 가려지며(masking), 내부 블록의 변수가 우선적으로 사용됩니다.

#include<stdio.h>
main() {
    int i = 1;
    {
        int i = 2;
        printf("%d", i);
    }
}

실행 결과

2

출력값이 2인 이유는, 내부 블록의 i가 외부 블록의 i를 가렸기 때문입니다. 내부 블록이 끝난 후에는 다시 외부의 i = 1이 유효해집니다.

중첩 블록에서의 접근 규칙

내부 블록 바깥에서 선언된 변수는, 그 변수가 내부 블록 안에서 다시 선언되지 않은 경우에 한해 중첩된 내부 블록에서도 접근할 수 있습니다.

#include<stdio.h>
main() {
    int i = 1;
    {
        int j = 2;
        printf("%d", j);
        printf("%d", i);
    }
}

실행 결과

2 1

정리하면, C 언어의 범위 규칙은 다음과 같습니다.

  • 전역 변수: 블록 밖에서 선언되며, 프로그램 전체에서 접근 가능
  • 지역 변수: 블록 안에서 선언되며, 해당 블록 안에서만 유효
  • 이름 충돌: 같은 이름이라도 서로 다른 블록이면 별개의 변수로 취급
  • 변수 가리기: 내부 블록의 재선언은 실행 중 외부 변수를 일시적으로 가림
  • 중첩 접근: 내부 블록에서 재선언되지 않았다면 외부 변수에 접근 가능