소프트웨어/C 언어

[C언어]20. 변수의 특별한 성질들 -1- ( 지역변수와 전역변수 )

리습 2013. 6. 6. 09:30


 안녕하십니까. 리습입니다.



 지금까지 우리가 프로그램을 만들어보면서 변수 선언에 대하여 큰 신경을 쓰지 않았습니다. for 문 의 내부에도 변수를 신경없이 썼으며 이름 또한 i , j  , a , b 등을 사용하였습니다.  하지만 조금만 더 큰 프로그램을 만들때에는 변수에 대해서도 여려가지를 신경써야합니다. 그 첫번째로써 지역변수와 전역변수에 대하여 알아보도록 하겠습니다.

 

  변수의 선언 위치

 

 변수를 선언할 수 있는 위치는 크게 두곳입니다. 함수의 내부와 외부입니다.  그림으로 한번 보도록 하겠습니다.



a 라는 변수는 특정 함수가 아닌 외부에 선언되었고  b라는 변수는 main 함수 내부에 선언되었습니다. a와 같이 선언되어있는 경우 전체에 대하여 변수로써 선언되었다고 하여 전역 변수 라고 하며 , b와 같이 선언되어있는 경우 특정 함수에서만 사용하도록 선언되었다고 하여 지역변수라고 합니다. 여기 까지 보시면 왜 지역변수와 전역변수를 나누지? 라고 생각하실수도 있습니다. 하지만 지역변수와 전역변수는 매우 중요합니다. 변수에 대한 접근성이 그 이유이입니다. 

 

  지역변수와 전역변수의 차이

 

 전역변수의 경우 말 그대로 전체를 위해서 만들어진 변수입니다. 정확하겐 전역변수가 선언되어있는 .cpp 내부의 어떤 코드라도 접근할 수 있도록 만들어진 변수입니다. 때문에 코드 전체에서 사용해야 하는 변수의 경우 전역변수로 선언하여 모든 함수에서 불러다가 사용하면됩니다. 

 

 코드

 #include <stdio.h>

 int result = 0;

 int main( void )

 {

      result = 3 + 2;

      check ();

      return 0;

}

int check ( void )

{

      printf("결과값은 %d 입니다. \n", result );

      return 0;

}

      

 결과

 결과값은 5 입니다. 

 

 다음 코드를 보면 main 함수에서도 result를 불러서 사용하고있으며 check 에서도 result 를 불러서 사용하고 있습니다. 이렇게 다양한 곳에서 한변수를 계속 불러내야할 때 전역변수를 선언하여 사용하면 매우 편리합니다. 

 

 반면에 지역변수는 우리가 평상시에 함수 내부에서 변수를 선언하여 사용하는 것과 같습니다. 함수 내부에서 선언한 지역변수는 함수내부에서만 불러내 사용할 수 있으며 지역에 따라 접근성이 다르다 고 하여 지역변수라 합니다. 일반적으로 우리가 필요할 지역변수를 사용하는 것을 생각하시면 될것입니다. 

 

  지역변수와 전역변수 이름이 겹칠 때

 

 변수를 사용하다 보면 이름이 겹칠 때가 있습니다. 대부분의 경우 에러로 처리되지만 특수한 경우 허용이 되며 접근이 다르게 됩니다. 코드를 보도록 하겠습니다.

 

 코드

 #include <stdio.h>

 int same = 1111;

 int main ( void )

 {

      printf("메인함수에서 same은 %d\n" , same);

      if ( 1 )

      {

             int same = 2222;

             printf("if내부에서 same은 %d\n" , same);

             if ( 1 )

             {

                    int same = 3333;

                    printf("if내부의 내부에서 same은 %d\n" , same);

              }

             printf("if내부에서 same은 %d\n" , same);

        }

        printf("메인함수에서 same은 %d\n" , same);

        return 0;

 }

 

 결과

 메인함수에서 same은 1111

 if내부에서 same은 2222

 if내부의 내부에서 same은 3333

 if내부에서 same은 2222

 메인함수에서 same은 1111

 

실제 컴파일후 작동해 봐도 같습니다.

 

 

 이런 현상이 일어나는 이유는 간단합니다. 특정 지역에서 변수에 접근할 때 같은 이름이 있다면 더 자신에게 가까운 ( 같은 지역에 있는 ) 변수에 접근하는 것입니다. 그림으로 나타내면 다음과 같습니다.

 




 

 메인에 있는 printf는 전역변수 same에 접근한것이며 if 에 있는 printf는 if 내부에 있는 지역변수 same에 접근한것입니다. 마찬가지로 if-if 내부에 있는 printf 는 그 내부의 same에 접근한것입니다.  if-if 를 끝낸 후에 if내부의 printf 로 다시 same에 접근하자 결과 값은 2222가 나옵니다. 그것은 지역변수에 같은 이름의 변수를 선언하여도 밖의 같은 이름의 변수와 전혀 다른 변수공간으로써 사용된다는 것을 보여줍니다. main에서 접근하는 printf 도 마찬가지입니다. 결론적으로 지역변수 끼리도 { } 따라 지역이 나누어져 접근성이 다르다 라고 이해하시면 됩니다.

 

 변수의 선언 위치에 따라 변수에 대한 접근성이 달라집니다. 그것을 지역변수 , 전역변수라 하며 성질을 잘 안다면 매우 유용한 코드를 만들수 있습니다. 하지만 모든 변수를 전역변수로 선언하거나 ( 불러내기 쉽게 하기 위해서 ) , 지역변수라 해서 이름을 무조건 겹치게 만들어서는 안됩니다. 첫번 째로 성능 문제가 있을 것이며( 전역변수는 메모리 공간을 항상 차지하므로 ) , 여러 곳에서 사용하는 공통된 변수 공간은 후에 프로그램 에러를 만드는 가장 큰 원인중 하나입니다.  때문에 적당히 편리할 정도만 사용하는 것이 중요합니다.