프로그래밍 언어/C언어

C언어 기초이론 (지역변수, 전역변수)

chobyeonggyu03 2024. 6. 13. 14:13

지역변수(Local Variable)란?

Local Variable라는 뜻으로 선언된 함수내에서만 선언되는 변수이다.

** 지역 변수의 특징 **

1) 함수내에 선언된 변수라고 생각하면 편함

2) 선언된 지역내에서만 유효하기때문에 지역만 다르다면 이름이 같아도 문제되지 않음

3) 지역변수는 함수에서 변수가 선언될 때 메모리 공간에 할당되며, 함수가 종료되면 메모리 공간이 소멸되는 구조임

4) 지역변수는 반복문이나 조건문에서도 선언이 가능함 (반복문에서는 계속해서 생성과 소멸이 반복됨)

5) 지역변수는 외부에 동일한 이름의 변수가 있을 시 코드에서 가리고 인식됨

6) 지역변수는 선언된 함수내에서만 존재하는 공간이기때문에 해당 지역(함수)를 벗어나게 되면 자동으로 소멸됨

 

/*
제목: 함수 예제 9-6
날짜: 2024.02.27.
내용: 지역변수와 전역변수 동일한 변수 이름을 다른 범위에서 메인
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int num = 1;

    if (num == 1) {
        int num = 7; // 지역 변수로 num 재선언
        num += 10; // 지역 변수에 10을 더함
        printf("영역 안 변수 num: %d \n", num); // 지역 변수 출력
    }

    printf("main 함수 내 지역변수 num: %d \n", num); // 전역 범위의 num 출력

    return 0;
}

 

 

 

 

전역변수(Global Variable)란?

Global Variable라는 뜻으로 함수를 넘어 프로그램 전체에 선언된 변수이다.

** 전역 변수의 특징 **

1) 함수 밖에 선언된 변수라고 생각하면 편함

2) 어디서든 접근이 가능한 변수이기에 여러 함수에서 반복적으로 호출이 가능함

3) 전역변수와 동일한 이름의 변수가 선언될 시에는 지역변수가 우선시 됨 (함수 외에 있는 전역변수는 가리고 지역변수를 우선적으로 읽음)

4) 프로그램의 구조를 복잡하게 만드는 주범임 ( 선언한 전역변수가 늘어날 때마다 저장공간 할당과 호출등의 과정들이 기하급수적으로 복잡해짐

5) 함수의 실행과 종료에 따라 생성되고 소멸되는 지역변수와 달리 전역변수는 프로그램이 처음 실행될 때부터 메모리 공간에 할당되어 해당 프로그램이 종료 될 때까지 남아있는 변수임

정적 변수(static Variable)란?

Static Variable라는 뜻으로 지역변수와 전역변수의 성격을 둘다 가지고 있는 변수이다.

** 정적 변수(Static Variable)의 특징 **

1) 지역변수+전역변수 라고 생각하면 편함

2) 초기화되지 않으면 0으로 초기화되고, 전역변수와 동일한 시기에 할당되고 소멸된다는 점은 전역변수와 같지만, 선언된 함수 내에서만 접근이 가능하다는 점은 지역변수와 같다는 특징이있음

3) static 지역변수는 전역변수로 쉽게 대체 가능하지만 훨씬 더 안정적이기에 전역변수대신 static 지역변수로 대체시켜 안정성을 높이는 것이 좋음

4) 지역변수나 전역변수 앞에 static을 붙여 선언함

** 정적 변수 사용방법 **

static int num = 1;

(이런식으로 선언하는 변수 맨 앞에 붙여주면됨-기존 변수의 위치에 따라 static전역변수인지 static지역변수인지 나뉨)

 

/*
제목: 함수 예제 9-6
날짜: 2024.02.27.
내용: static 변수를 사용해 여러번 호출된 함수의 total을 적재적소에 잘 활용하기
*/

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 함수 정의 - static 변수를 포함하여 여러번 호출되어도 값을 유지
int AddTotal(int num) {
    static int total;  // static 변수 선언 - total이라는 변수가 함수 호출간에 값을 유지
    total += num;
    return total;
}

int main() {
    int num, i;
    for (i = 0; i < 3; i++) {
        printf("입력: ");
        scanf("%d", &num);  // 사용자 입력 받기
        printf("누적된 합계: %d\n", AddTotal(num));  // static 변수를 활용한 누적 합산 출력
    }

    return 0;
}

 


레지스터 변수(Register Variable)란?

Register Variable라는 뜻으로 CPU의 레지스터 저장공간에 저장시키겠다는 변수이다.

1) VIP를 위한 저장공간 정도로 생각하면 편함

2) 레지스터는 CPU내에 존재하며 접근과 연산이 빠른 메모리 공간으로 빈번하게 사용하며 접근이 가장 빠른 레지스터에 저장하는 것이 성능향상에 도움이 될때 레지스터 변수를 사용함

3) 레지스터 변수에 전역변수를 저장하는 일은 없는데 그 이유는 하나의 변수가 죽치고 앉아있기에는 너무 중요하고 비싼 메모리이기 때문임

** 레지스터 변수 사용방법 **

register int num = 1;

(이런식으로 선언하는 변수 맨 앞에 붙여주면)