C 언어 - 지역변수와 전역변수

컴퓨터/C

728x90
반응형

지역변수와 전역변수 

지금까지 프로그래밍을 하면서 이상한 점을 느끼셨나요 ? 분명 변수를 선언하고 사용하는데 왜 함수에 매개변수가 있고 반환이 있을까? 바로 변수의 특정 때문에 그렇습니다. 메모리를 조금 더 효율적으로 관리하게 위해서 프로그래밍에서 변수들이 움직일수 있는 범위를 제한해 둡니다. 이런 변수들을 지역변수라고 하고 모든 영역에서 쓸수 있는 변수를 전역 변수라고 부릅니다.

 

지역변수

지난 글들에서 소스코드의 범위를 항상 중괄호 { } 로 구분하여 사용하고 있었습니다. 어떤 중괄호 안에 변수가 선언되면 그 부분에서만 사용 할수 있는 변수가 바로 지역 변수입니다.

결국 선언된 시점 부터 포함된 중괄호 { } 가 끝나는 지점에서 해당 지역 변수는 사라집니다.

소스코드를 통해 한번 알아보도록 하겠습니다.

#include <stdio.h>

int main()
{
    int number = 10; // main문 안에만 존재할수 있는 지역 변수

    while (1)
    {
        int number2 = 100; // while문 안에만 존재할수 있는 지역 변수
        printf("%d\n%d\n", number, number2); // 두개의 변수 다 사용 가능
        number++;
        number2++;
        if (number == 15)
            break;
    }
    //printf("%d\n%d", number, number2); // error발생

    return 0;
}

  • main함수의 시작
  • int number 변수 선언 및 10의 값 대입
  • 반복문의 시작 
  • int number2 변수 선언 및 100의 값 대입
  • number와 number2 출력
  • number와 number2 1씩 증가 
  • 반복문이 처음으로 돌아가면서 number2 소멸 
  • number가 15가 될 때 까지 반복

지역변수의 필요성

위의 소스코드의 경우 만약 지역변수가 아니라면 반복문 안에서 number2라는 변수가 계속해서 선언 될 것입니다. 

이렇다면 동일한 변수명으로 선언을 하려고 하기 때문에 문제가 생깁니다. 같은 변수명이 존재한다면 어떤 것에 값을 넣을지 선택을 하기 힘들기 때문입니다.

또한 선언된 변수가 특정 영역에서만 필요한데 사라지지 않고 계속해서 선언된다면 그 프로그램은 메모리를 사용량이 누적되어 불필요한 변수들이 계속해서 존재 할 것입니다.

하지만 이런 지역변수만 사용한다면 모든 곳에서 공통으로 쓰고 싶은 변수들은 어떻게 해야 될까요?

 

전역변수 

전역변수는 내가 만든 프로그램 어디에서든 자유롭게 쓸수 있는 변수입니다. 전역변수를 선언하는 방법은 간단합니다 가장 큰 영역에 변수를 선언하면 됩니다. 우리가 작성하는 소스코드에서는 main문이 아닌 그 밖, 즉 아무 중괄호 { } 가 없는 영역에 선언을 하면 됩니다. 그럼 아래 소스코드를 통해 전역변수를 선언하여 써보도록 하겠습니다.

 

#include <stdio.h>

int g_number = 0; //전역 변수의 선언 

void func()
{
    g_number++;
    return;
}

int main()
{
    printf("%d\n", g_number);
    g_number++;
        printf("%d\n", g_number);
    func();
    printf("%d\n", g_number);
    return 0;
}

g_number라는 전역변수를 선언함으로서 소스코드의 어떤 영역에서도 사용할수 있게 됬습니다. 이런식으로 전역변수는 모든 소스코드의 영역에서 사용할 수 있지만 프로그램이 끝날때까지 항상 메모리를 차지하고 있게 될 것입니다. 강력한 기능을 가졌지만 비효율적인 변수인셈입니다.  

 

예제를 통해 다듬어 보기

예제1) 지역변수와 글로벌 변수의 이름이 같다면 ?

#include <stdio.h>

int g_number = 0; //전역 변수의 선언 

void func()
{
    g_number++;
    return;
}

int main()
{
    int g_number = 100;
    printf("%d\n", g_number);
    g_number++;
        printf("%d\n", g_number);
    func();
    printf("%d\n", g_number);
    return 0;
}

지역변수와 전역변수는 이름을 똑같이 선언할 수 있습니다. 하지만 동일한 이름이 있다면 우선순위는 지역변수가 높습니다.

위의 소스코드를 보면 전역변수 g_number와 main함수안에 지역변수 g_number가 각각 선언되었습니다.

main문 안에서 g_number는 지역변수를 활용하여 사용합니다.  하지만 지역변수가 속하지 않은 함수 func에서는 전역변수 g_number를 사용합니다. 이처럼 지역변수와 전역변수를 잘 구분하여 활용 해야 됩니다.

 

예제2) 지역변수의 특성을 사용한 for문

#include <stdio.h>



int main()
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d\n",i);
    }
    printf("%d\n", i);


    for (int j = 0; j < 10; j++)
    {
        printf("%d\n", j);
    }
    //printf("%d\n", j); // error 발생 
    return 0;
}

for문 처럼 초기식에 들어가는 변수를 for문이 끝나고 나서도 사용하고 싶다면 for문의 밖에서 변수를 선언한 다음 사용해야 됩니다.

 

예제3) 지역변수는 함수의 매개변수로 갈때 복사만 된다.

#include <stdio.h>

void func(int num)
{
    num = num * 2;
    printf("함수 안으로 온 매개변수는 함수의 지역변수 입니다. 값 : %d\n", num);
    return;
}

int main()
{
    int num = 10;
    printf("main함수 안의 지역변수 num : %d\n", num);
    func(num);
    printf("func끝난 후 main함수 안의 지역변수 num : %d\n", num);

    return 0;
}

 

결과 보기

더보기

변수의 특성을 이해 했다면 결과를 예상해 볼수 있을 겁니다 직접 생각해보고 확인해 보세요 !

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - 메모리주소  (0) 2021.06.12
C 언어 - 배열과 문자열  (0) 2021.06.09
C 언어 - 용어 알아보기  (0) 2021.06.08
C 언어 - 함수  (0) 2021.06.06
C 언어 - 제어문 break / continue / return  (0) 2021.06.05

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :