ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 변수의 범위
    Visual Studio/C 기초 2012. 9. 7. 16:55

    이번에 알려드릴 내용은 변수, 즉 우리가 생성하는 int형 float형 long형 등등 많이 쓰이는 내용입니다. C언어든 다른 컴파일러든 가장 기본적이며 가장 중요하기 때문에 아주 자세하게 알려드릴테니 많은 정보 얻어가시길 바랍니다. 차례대로 외부 변수, 지역 변수, 정적 변수, 자동 변수, 매개 변수, 정적 외부 변수, 레지스터 변수에 대해 알아보겠습니다.

    변수의 범위는 프로그램에서 변수를 사용할 수 있는 범위를 뜻합니다. C에서 변수에 대해 설명할 땐 변수의 값을 사용할 수 있는 접근성과 주어진 범위 내에서 효과를 나타내는 가시성을 함께 사용합니다. 간단한 예를 들어보겠습니다.

     

     #include <stdio.h>

    int x = 1000;
    void print_value(void);

    main(void){
     printf("%d\n",x);
     print_value();
    }
    void print_value(void)
    {
     printf("%d\n",x);
    }

    저 예제를 컴파일 하면 두 문장 다 정상적으로 1000이 출력되는데요, 변수를 메인 함수 내로 위치를 변경하면 선언되지 않은 식별자라며 에러메시지가 뜹니다. 이유가 무엇일까요?

    메인 함수로 x의 위치를 옮기면 변수 x의 유효 위치는 메인 함수에 한정되기 때문입니다.

    그렇다면 항상 변수를 메인 함수 바깥쪽에다 정의(이를 외부 변수라 합니다.)를 하는게 편하지 않을까라는 의문이 생기는데, 외부 변수를 가급적이면 사용을 자제해야 합니다.

    구조화 프로그래밍에서 중심이 되는 모듈의 독립성이 사라지게 되는데, 모듈의 독립성이란 프로그램을 구성하는 각각의 함수나 모듈이 주어진 작업을 수행하기 위해서 필요로 하는 모든 코드와 데이터를 내부에 포함하고 있는 것을 뜻합니다.

    결론은, 더 크고 복잡하고 무거운 프로그램을 작성하게 되면 외부변수에 대한 함수의 의존성은 중요한 문제가 됩니다.

    사용도가 빈번한 프로그램에서만 선언해 주면 문제 없습니다.

     

    #include <stdio.h>

    int x = 1000;
    void print_value(void);

    main(void){           
     extern int x;              //extern은 외부 선언문입니다.
     printf("%d\n",x);
     print_value();
    }
    void print_value(void)
    {
     extern int x;
     printf("%d\n",x);

       

    외부 선언문은 반드시 사용해야 하는건 아니지만 위 프로그램의 print_value()가 외부 변수 x의 전역 선언문과 다른 모듈에 포함된다면 외부 선언문이 필요합니다.

    지역 변수

    지역 변수(local variable)는 함수 내에서 정의되는 변수입니다. 지역 변수의 범위는 변수가 정의된 함수로 제한되고, 지역변수를 초기화하지 않으면 쓰레기 값이 출력됩니다. 반드시 초기화 해줍시다.

    정적 변수와 자동 변수

    지역 변수는 기본적으로 자동 변수인데, 자동 변수는 함수가 호출될 대마다 새롭게 생성되고 실행이 끝나면 자동으로 사라지는 변수를 뜻합니다. 함수가 새로이 호출될 때 변수가 새롭게 생성됩니다.

    그런데 어떨 땐 지역 변수의 값을 보존할 필요가 있습니다. 그럴 땐 static을 사용해 정적 변수로 바꾸면 됩니다. static int x; 처럼 말이죠.

    정적 변수와 자동 변수의 예를 보여드리겠습니다.

     

    #include <stdio.h>

    void fuction1(void);
    main(){
     int count;
     for(count = 0; count < 20; count++)
     {
      printf("반복합니다 %d : ", count);
      fuction1();
     }
    }
    void fuction1(void){
     static int x = 0;     //정적 변수로 변환합니다.
     int y = 0;
     printf("x = %d, y = %d\n",x++, y++);

    결과

     

    x와 y의 차이를 아시겠습니까? x는 static형인 정적 변수로 선언되었기 때문에 카운트 값이 1씩 증가할 때마다 값이 누적되서 출력되는 반면, y는 자동 변수로써 반복될 때마다 y가 계속 재생성되기 때문에 y의 초기값으로만 출력됩니다. 어렵지 않죠?

    매개 변수

    함수의 헤더에서 매개 변수로 사용되는 변수는 지역 변수와 같은 유효 범위를 가집니다.

    void function1(int x)

    {

    int y;

    }

    x와 y는 함수 fuction1 내에서만 유효하게 사용되는 지역 변수입니다. 매개 변수는 항상 대응하는 인수에 의해 전달되는 값을 가지게 되므로 static으로 지정해도 소용이 없어요 ㅠ

    정적 외부 변수

    외부 변수를 정의할 때 static을 사용하면 정적 변수로 만들 수 있는 것은 아시죠? 일반 정적 변수와 정적 외부 변수의 차이는 변수의 유효 범위입니다. 그냥 외부 변수는 파일 내에 포함되어 있는 모든 함수에서 유효하고 다른 파일에 포함되어 있는 함수에 의해서도 사용 가능하지만 외부 정적 변수는 단지 변수가 정의된 파일 내에서 변수가 정의된 부분 이후에 존재하는 함수에만 유효합니다. 이 점만 넘어가고 레지스터 변수에 대해 알아보겠습니다.

    레지스터 변수

    register는 자동 지역 변수가 메모리 대신에 프로세서의 레지스터에 저장되도록 컴파일러에게 지시합니다. 어떤 변수의 값을 레지스터에 저장하여 사용하면 변수의 값을 더 빨리 읽어들일 수 있습니다.

    자동 변수를 선언할 때 register를 포함시키면 변수를 레지스터에 저장할 수 있도록 '요청'할 수 있습니다. 프로그램의 상태에 따라 변수의 값을 저장하기 위한 레지스터가 남아있지 않을 수 있기 대문에 '요청'이란 단어를 사용한겁니다.

    void fuction1(void)

    {

    register int x;

    }

    레지스터 변수의 가장 큰 장점은 반복문의 카운트와 같이 함수 내에서 빈번히 사용할 때 장점을 발휘합니다. register는 배열이나 구조체가 아닌 간단한 숫자 변수에서만 사용할 수 있습니다.

     

    반복문 제어에 대해 알아보겠습니다.


     

    'Visual Studio > C 기초' 카테고리의 다른 글

    C언어 switch  (0) 2012.09.10
    C언어 반복문제어 (break, continue, goto)  (0) 2012.09.08
    C언어 구조체 멤버로 사용되는 포인터  (0) 2012.09.07
    C언어 구조체와 배열  (0) 2012.09.06
    C언어 구조체의 기본  (2) 2012.09.06

    댓글

Designed by Tistory.