Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 변수의 종류 본문

C언어

C언어 - 변수의 종류

깅햄찌 2022. 9. 12. 22:31
반응형

안녕하세요~ 오늘은 C언어에서 변수의 종류에 대해 알아보겠습니다.

C언어에서의 변수의 종류는 아래 4가지가 대표적인데요!
차례대로 정리해보겠습니다.
1. 지역변수
2. 전역 변수
3. 정적 변수
4. 레지스터 변수

1. 지역변수

아래 코드에서 value라는 변수를 각각 다른 함수에서 정의했을 때 다른 함수에 영향을 주는지 알아보겠습니다.

#include<stdio.h>

void random_func(){
    int value = 7;
    printf("value in random_func : %d\n",value);
}

int main(){
    int value = 3;
    random_func();
    printf("value in main_func : %d\n",value);
    return 0;
}

아래 결과와 같이 random_func 함수 안에 value는 7이고 main 함수 안에 value는 3으로
value 변수가 각각 다른 함수에 정의되었지만 정의된 함수 이외의 곳에서는 영향을 주지 않는 것을 확인할 수 있습니다.
value 변수처럼 함수 안에서 자료형+변수 이름으로 선언된 변수는 지역변수라고 합니다.

Tips 지역변수는 선언된 함수 안에서만 사용할 수 있어서 디버깅에 유리하고
선언된 블록이 끝나면 저장공간이 메모리에서 사라짐으로 메모리를 효율적으로 사용할 수 있습니다.

* 동일한 지역변수가 하나의 함수에서 여러 번 선언될 수 있습니다.

(사실 현업 코드에서 이런 경우는 거의 없겠지만 알아두면 좋을 것 같습니다~)

#include<stdio.h>

int main(){
    int value = 3;
    printf("value in First block : %d\n",value);
    {
        int value = 4;
        printf("value in Second block : %d\n",value);
        {
            int value = 5;
            printf("value in Thrid block : %d\n",value);
        }
    }
    return 0;
}

앞에서 지역변수는 선언된 함수 안에서만 사용할 수 있다고 했지만 정확히 말하면
선언된 블록 안에서만 사용할 수 있다고 할 수 있습니다.

2. 전역 변수

전역 변수의 특징
1. 지역변수와 다르게 특정 함수 안에서 선언되는 것이 아니라 그 이외의 지역에서 선언됩니다.
2. 프로그램의 시작과 동시에 메모리에 할당되어 프로그램이 끝날 때까지 메모리에 남아있습니다.
3. 초기화되지 않은 전역 변수는 메모리 BSS 영역에 할당되어 자동적으로 0으로 초기화됩니다.
4. 같은 이름의 지역 변수에 의해 사용 범위가 제한됩니다.

#include<stdio.h>

int value = 7;

void random_func(){
    printf("value in random_func : %d\n",value);
}

int main(){
    random_func();
    printf("value in First block : %d\n",value);
    {
        int value = 4;
        printf("value in Second block : %d\n",value);
        {
            int value = 5;
            printf("value in Thrid block : %d\n",value);
        }
    }
    return 0;
}

아래 결과에서도 알 수 있듯이 같은 이름의 지역 변수에 의해 사용 범위가 제한되어 Second, Third block에서는 지역변수 value 값이 출력되고 그 이외의 영역은 모두 전역 변수 value가 출력되는 것을 확인할 수 있습니다.

3. 정적 변수

1. 정적 변수는 static+자료형+변수 이름으로 선언할 수 있습니다.
2. 정적 변수는 메모리의 BSS 영역에 할당됨으로 0으로 초기화됩니다.
3. 프로그램이 시작될 때 메모리에 할당되어 프로그램이 끝날 때 메모리에서 사라집니다.

#include<stdio.h>

void local_func(){
    int value = 0;
    value++;
    printf("value in local_func : %d\n",value);
}

void static_func(){
    static int value;
    value++;
    printf("value in static_func : %d\n",value);
}

int main(){
    local_func();
    local_func();
    local_func();

    static_func();
    static_func();
    static_func();
    
    return 0;
}

아래 결과와 같이 지역변수 value는 main함수에서 local_func이 끝나면서
메모리에서 사라지기 때문에 계속해서 1을 출력하였습니다.
하지만 정적변수 value는 프로그램이 끝날 때까지 메모리에서 사라지지 않으므로
value 값을 기억하여 static_func 함수가 호출될 때마다 value값에 1을 더해줄 수 있습니다.

4. 레지스터 변수

1. 레지스터 변수는 register+자료형+변수 이름으로 선언할 수 있다.
2. 레지스터 변수로 선언해도 레지스터 변수로 사용되는 여부는 컴파일러가 결정합니다.
3. 레지스터 변수는 말 그대로 레지스터에 할당되어 메모리의 주소는 구할 수 없습니다.
4. 전역 변수는 레지스터 변수로 선언할 수 없습니다.
5. 메모리보다 레지스터가 연산장치와의 데이터 공유가 빠르기에 레지스터 변수를 사용합니다.

아래 코드는 register 변수로 선언해서 연산 시와 지역 변수로 선언해서 연산 시의 속도 차이를 출력해보았습니다.

#include <stdio.h>
#include <time.h>

int main(){
    
   clock_t s1,s2,e1,e2;
   float r1,r2;
   register int index1;
   int index2;
   int total1,total2;

   s1 = clock(); 
   for(index1=0; index1 < 1000000; index1++){
    total1 += index1;
   }
   e1 = clock();
   r1 = (float)(e1-s1)/CLOCKS_PER_SEC;
   printf("register calc %.5f\n",r1);
   
   
   s2 = clock(); 
   for(index2=0; index2 < 1000000; index2++){
    total2 += index2;
   } 
   e2 = clock();
   r2 = (float)(e2-s2)/CLOCKS_PER_SEC;
   printf("local calc %.5f\n",r2);

   return 0;
}

실행 시마다 실행시간이 다르게 나오긴 하지만 register 변수로 선언했을 때가 지역변수로 선언했을 때보다 0.001~0.002 정도 빠른 것을 확인할 수 있었습니다.

오늘은 C언어에서 변수의 종류에 대해 알아보았습니다.

아래 4가지 변수가 잘 정리되었다면 좋겠네요~
1. 지역 변수
2. 전역 변수
3. 정적 변수
4. 레지스터 변수

그럼 다음 포스팅에서 만나요 좋은 하루 보내세요~~

Comments