안녕하십니까. 리습입니다.
지금까지 우리가 프로그램을 만들어보면서 변수 선언에 대하여 큰 신경을 쓰지 않았습니다. 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 도 마찬가지입니다. 결론적으로 지역변수 끼리도 { } 따라 지역이 나누어져 접근성이 다르다 라고 이해하시면 됩니다.
변수의 선언 위치에 따라 변수에 대한 접근성이 달라집니다. 그것을 지역변수 , 전역변수라 하며 성질을 잘 안다면 매우 유용한 코드를 만들수 있습니다. 하지만 모든 변수를 전역변수로 선언하거나 ( 불러내기 쉽게 하기 위해서 ) , 지역변수라 해서 이름을 무조건 겹치게 만들어서는 안됩니다. 첫번 째로 성능 문제가 있을 것이며( 전역변수는 메모리 공간을 항상 차지하므로 ) , 여러 곳에서 사용하는 공통된 변수 공간은 후에 프로그램 에러를 만드는 가장 큰 원인중 하나입니다. 때문에 적당히 편리할 정도만 사용하는 것이 중요합니다.
'소프트웨어 > C 언어' 카테고리의 다른 글
[C언어]22. 변수의 특별한 성질들 -3- ( 정적 변수 , static ) (0) | 2013.06.10 |
---|---|
[C언어]21. 변수의 특별한 성질들 -2- ( 전역변수로의 외부 모듈 접근 ) (0) | 2013.06.07 |
[C언어]19.#include 가 어떻게 작동하는가. (#include , #의 의미 ) (2) | 2013.06.06 |
[C언어]18. 헤더파일이란 무엇인가 ( 헤더파일을 만드는 법 ) (5) | 2013.06.06 |