Programming/C

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

JunsuKim 2021. 9. 22.
728x90

변수는 선언되는 위치에 따라서 "전역변수"와 "지역변수"로 나뉜다.

둘의 차이점으로는 다음과 같은 것이 있다.

  1. 메모리상에 존재하는 기간
  2. 변수에 접근할 수 있는 범위

지역변수

지역변수에서 "지역"이란 중괄호로 인해 생성된 영역을 말한다. 따라서 지역변수란 중괄호 안에 선언된 모든 변수를 말하는 것이다. 지역변수는 "선언된 지역 내에서만 유효하다"는 특성을 가진다.

#include<stdio.h>

int SimpleFuncOne() {
    int num = 10;
    num++;
    printf("SimpleFuncOne num: %d\n", num);
    return 0;
}

int SimpleFuncTwo() {
    int num1 = 20;
    int num2 = 30;
    num1++;
    num2--;
    printf("num1 & num2: %d %d\n", num1, num2);
    return 0;
}

int main() {
    int num = 17;
    SimpleFuncOne();
    SimpleFuncTwo();
    printf("main num: %d\n", num);
    return 0;
}

/*
SimpleFuncOne num: 11
num1 & num2: 21 29
main num: 17
*/

SimpleFuncOne함수를 보자. 함수 안에 있는 변수 num은 지역변수이다. 따라서 이 변수는

SimpleFuncOne 함수를 빠져나가기 직전까지만 유효하다. 지역변수는 해당 지역을 벗어나면 자동으로 소멸되기 때문이다. 다른 함수들 안에도 num이라는 변수가 있지만 지역변수는 선언된 지역 내에서만 유효하기 때문에 선언된 지역이 다르다면 변수의 이름이 같아도 문제가 되지 않는다.

 

지역변수는 반복문이나 조건문에도 선언이 가능하다. 이들 또한 중괄호가 존재 할 수 있기 때문이다.

#include<stdio.h>

int main() {
    int cnt = 0;
    for(cnt=0; cnt<3; cnt++) {
        int num = 0;
        num++;
        printf("%d번째 반복, 지역변수 num = %d\n", cnt+1, num);
    }
    if(cnt == 3) {
        int num = 7;
        num++;
        printf("if문 내에 존재하는 지역변수 num = %d\n", num);
    }
    return 0;
}

/*
1번째 반복, 지역변수 num = 1
2번째 반복, 지역변수 num = 1
3번째 반복, 지역변수 num = 1
if문 내에 존재하는 지역변수 num = 8
*/

이와 같이 for문 안에 있는 num은 반복을 하면서 for문을 탈출했다 들어왔다를 반복하므로 num의 값이 초기화와 증감이 반복된다. 또한 if문 안에서 num이라는 새로운 지역변수를 7로 선언했기 때문에 if문 안의 num은 7이 출력되는 것이다.

#include<stdio.h>

int main() {
    int num = 1;
    if(num == 1) {
        int num = 7;
        num += 3;
        printf("if문 안의 지역변수 num = %d\n", num);
    }
    printf("main 함수 안의 지역변수 num = %d\n", num);
    return 0;
}

위에서 각각의 num값은 어떻게 되겠는가?

우선 if문 안에서의 num은 10으로 출력이 될 것이다. if문의 중괄호 안에 num이라는 지역변수가 있기 때문이다. 하지만 if문을 나온 다음 있는 출력하는 결과는 1이 된다. 이는 if문 안에 있는 지역변수는 초기화가 되었고, main함수 내에서 선언된 지역변수인 num = 1인 값이 출력되기 때문이다.

 

함수를 정의할 때 선언하는 매개변수도 지역변수의 일종이다.

  • 선언된 함수 내에서만 접근이 가능하다.
  • 선언된 함수가 반환을 하면, 지역변수와 마찬가지로 소멸된다.

따라서 매개변수는 지역변수이다.라고 해도 틀리지 않는다.

하지만 역으로는 성립이 되지 않는다. 모든 지역변수가 매개변수는 아니기 때문이다.

* 지역변수는 매개변수를 포함한다.

전역변수

전역변수는 지역변수와 달리 중괄호 안에 선언되지 않는다.

#include<stdio.h>

int num;

void Add(int value) {
    num += value;
}

int main() {
    printf("num: %d\n", num);
    Add(3);
    printf("num: %d\n", num);
    num++;
    printf("num: %d\n", num);
    return 0;
}

/*
num: 0
num: 3
num: 4
*/

위에서 보이 듯이 함수가 선언되기 전에 num이라는 변수를 선언해 주었다. 이가 전역변수이다.

전역변수의 특징은 다음과 같다.

  • 프로그램의 시작과 동시에 메모리 공간에 할당되어 종료 시까지 존재한다.
  • 별도의 값으로 초기화하지 않으면 0으로 초기화된다.
  • 프로그램 전체 영역 어디서든 접근 가능하다.

만약 전역변수와 지역변수가 이름이 같게 선언되면 어떻게 될까?

이러한 경우가 있다면 지역 내에 있는 지역변수로서의 접근이 이뤄진다. 

#include<stdio.h>
int num;

int main() {
    int num = 1;
    printf("%d", num);
    return 0;
}

// 1

 

전역변수는 중간에 소멸되지도 않고 어디서든 접근이 가능하기 때문에 유용해 보일 수 있다. 하지만 전역변수를 많이 선언하는 것은 좋은 행동이 아니다. 프로그램의 구조를 복잡하게 할 수 있기 때문이다. 물론 전역변수를 선언함으로써 더 좋은 코드가 될 수도 있다.

static변수

전역변수와 지역변수 모두 static 선언을 할 수 있다. 여기서는 지역변수에 static 선언을 하는 것을 보겠다.

지역변수에 static 선언을 하게 되면, 전역변수의 성격을 지니는 변수가 된다.

#include<stdio.h>

void SimpleFunc() {
    static int num1 = 0;
    int num2 = 0;
    num1++;
    num2++;
    printf("static: %d, local: %d\n", num1, num2);
}

int main() {
    for(int i=0; i<3; i++) SimpleFunc();
    return 0;
}

/*
static: 1, local: 0
static: 2, local: 0
static: 3, local: 0
*/

이와 같이 static 선언을 한 지역변수는 프로그램 종료 시까지 메모리 공간에 존재하게 된다.

728x90

댓글