본문 바로가기

Program Language and Algorithm

전역변수와 지역변수가 같은 이름 일때 전역변수에 접근하기.

반응형

C언어를 배우기 시작해서 중반부에 들어 가면 변수의 접근범위에 대해 배우게 되는데요.

전역, 지역, static, extern등을 배우게 됩니다.


이중에서 이번 주제는 딱 두개 전역과 지역 입니다.


일단 두가지의 변수의 범위에 대해서는 배웠다는 전제하에 써내려 가겠습니다.


#include <stdio.h>

int a = 1;
int main(){

    printf("%d\n", a);

    {
        int a = 2;

        printf("%d\n", a);
    }
    printf("%d\n", a);

    return 0;
}

위 의 코드에서 결과물은

1

2

1

이죠. 첫번째와 세번째는 전역 변수 a에 접근한거고 두번째는 지역변수 a에 접근한 결과 입니다.


하지만 만약 2번째에서도 전역변수에 접근하고 싶다면 어떻게 해야 할까요. 일반적인 문법으로 c언어에서는 불가능한 문법 입니다. 같은 statement안에서 변수명은 오직 하나씩 존재 합니다. 변수명이 같은 두개의 변수를 접근하는 건 허용되지 않습니다.

하지만 전역과 지역이 같은 이름으로 선언된 statement안에 만들어진 statemet라면 전역과 지역중 선택해서 사용이 가능합니다.

예제 코드는 다음과 같습니다.


#include <stdio.h> int a; void f(){ printf("global = %p\n", &a); } int main(void){ int a; f(); printf("main = %p\n", &a); { int a; printf("inner1 = %p\n", &a); { extern int a; printf("inner2 = %p\n", &a); { extern int a; printf("inner3 = %p\n", &a); { int a; printf("inner4 = %p\n", &a); { extern int a; printf("inner5 = %p\n", &a); } } } } } return 0; }

위 코드의 결과는 아래와 같습니다.



main함수 안에 무려 5개의 statement가 있고 모두 a를 선언 합니다. 전부 지역 변수라면 당연히 주소값이 달라야 하지만 inner2, inner3, inner5의 주소값은 전역과 동일합니다. 


해당 statement에서는 지역 변수가 아닌 extern을 사용 하였습니다. 

이런 방법을 통해 내부 statemet에서 전역 변수의 접근이 가능합니다.


일단 방법은 이렇습니다.


하지만 애초에 큰 의미가 없는 기술입니다.

왜 전역과 지역의 변수명이 같아야 하나요? c++이나 java같은 객체 지향이라면 이해가 가지만 c언어는 순차적인 언어 입니다. 객체를 만들어 객체에 접근하는 개념의 언어가 아니라 main의 시작 부터 끝까지 한줄 한줄 읽어 내려가는 언어 입니다.

변수명이 같다는 것은 코딩하는 사람에게만 의미 있는 것이죠. 아무리 개념적으로 전역과 지역의 역할이 같다고 해도 같은 이름을 쓰는건 코드를 해석하기 어렵게 만들 뿐이라고 생각합니다.

즉, 결론은 애초에 전역과 지역의 변수명을 다르게 쓰시는 걸 추천합니다.


이상 갑자기 끗.



반응형