[C] 지역, 전역, 정적 변수

방법이있지·2025년 6월 17일

[정글 4-8주차] C언어

목록 보기
16/26
post-thumbnail

C언어 변수의 종류에는 지역, 전역, 정적 변수가 있습니다. 사용 범위 및 메모리 존재 기간이 각자 다르므로, 이 점에 집중해서 공부해봅시다.

지역 변수

  • 사용 범위가 함수 내부로 제한되는 함수
  • 원래 auto 예약어를 사용해야 하지만, 생략할 수 있음
  • 이름이 같아도 사용된 함수가 다르면 독립된 저장 공간을 가짐

지역 변수 선언하기

#include <stdio.h>

void other(void);

int main(void){
    int a = 0;      // 지역 변수 a
    other();
    printf("main 함수의 a: %d\n", a);
    return 0;
}

void other(void){
    int a = 10;     // 지역 변수 a (main에서 선언된 a와 다름)
    printf("other 함수의 a: %d\n", a);
}

// [출력]
// other 함수의 a: 10
// main 함수의 a: 0
  • main 함수와 other 함수에 같은 이름의 변수 a가 사용됐지만, 함수가 다르므로 문제 없음
    • main 함수 내에선 main에서 할당된 변수 a만 사용 가능
    • other 함수 내에선 other에서 할당된 변수 a만 사용 가능
  • a는 독립된 저장 공간을 가지므로, other 함수가 호출돼도 maina의 값은 바뀌지 않음

특징

  • 지역 변수가 선언된 함수가 반환(종료)되면, 지역 변수에 할당된 저장 공간은 자동으로 회수됨
  • 함수의 매개변수는 지역 변수의 일종임
  • 메모리의 스택 영역에 위치

블록 내 지역 변수

  • 블록: 반복문, 조건문 등에 사용되는 괄호 ((), { })
  • 블록 내에서 선언된 지역변수는, 블록 내에서만 사용될 수 있음
    • 블록이 끝나면 할당된 저장공간이 자동으로 회수됨
int i = 555;

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

// [출력 (블록 내부에서 선언된 i 출력)]
// 0
// 1
// 2

printf("%d\n", i);

// [출력 (블록 외부에서 선언된 i 출력)]
// 555
  • 반복문 내부에서는, 외부에서 선언된 i가 아닌 내부에서 선언된 i를 사용
    • 따라서 0부터 시작해 1, 2를 출력
  • 반복문 내부의 i는 반복문이 종료된 후 사용될 수 없으며, 할당된 저장공간도 회수됨
    • 반복문 외부에서 i를 출력하면, 외부에서 선언된 i의 값을 출력

전역 변수

  • 함수 밖에서 변수를 선언하면 전역 변수가 됨
  • 사용 범위가 함수나 블록으로 제한되지 않음
    • 프로그램 전체에서 쓸 수 있음
    • 프로그램 시작 시 메모리가 할당되고, 종료 시까지 존재함
#include <stdio.h>

int num;  // 전역변수

void set(int newNum);

int main(void){
    // 전역변수는 초기화하지 않아도 0으로 초기화됨
    printf("%d\n", num);    // [출력] 0
    set(10);
    printf("%d\n", num);    // [출력] 10
    set(20);
    printf("%d\n", num);    // [출력] 20
    return 0;
}

void set(int newNum){
    num = newNum;           // 전역변수 num에 매개변수 newNum의 값 대입
}
  • 전역변수 num의 값은 선언한 위치 이후 어디서든 쓸 수 있음
    • main 함수든, set 함수든 상관없음
  • 전역변수는 초기화하지 않아도 0으로 자동 초기화됨

특징

  • 전역변수와 지역변수의 이름이 같은 경우, 지역변수를 우선 사용함
#include <stdio.h>

int a = 10;  // 전역변수

void function(void);

int main(void){
    printf("%d\n", a);  // 10 (전역변수 a 출력)
    function();
    return 0;
}

void function(void){
    int a = 20;
    printf("%d\n", a);  // 20 (지역변수 a 출력)
}
  • 전역변수에 문제가 생긴 경우 그 변수를 사용하는 모든 함수를 디버깅해야 함
    • 꼭 필요한 경우가 아니면, 전역변수보단 지역변수를 사용하는 것이 좋음
  • 메모리의 데이터 영역에 위치

정적 지역 변수

  • 지역 변수를 선언할 때 static 예약어를 사용하면, 정적 지역 변수가 됨
  • 일반 지역 변수처럼, 사용 범위는 함수 / 블록 내부로 제한됨
  • 하지만 프로그램의 시작부터 종료까지, 저장 공간이 계속 유지됨
  • 선언된 함수가 반환(종료)되어도, 저장 공간이 계속 유지됨
    • 함수가 여러 번 호출될 때, 이전의 값을 계속 유지함
#include <stdio.h>

void auto_f(void){
    int a = 0;          // 일반 지역 변수
    a++;                // a의 값에 1을 더함
    printf("%d ", a);   // a를 출력
}

void static_f(void){
    static int a;       // 정적 지역 변수 (선언만 해도 0으로 초기화)
    a++;                // a의 값에 1을 더함
    printf("%d ", a);   // a를 출력
}

int main(void){
    for (int i = 0; i < 3; i++) auto_f();       // 1 1 1
    printf("\n");
    for (int i = 0; i < 3; i++) static_f();     // 1 2 3
    return 0;
}
  • auto_f의 일반 지역변수 a는 호출할 때마다 0으로 초기화됨
    • 그 값을 1 증가시키고 출력하므로, 항상 1이 출력됨
  • static_f의 정적 지역변수 a는 초기화하지 않으면 0으로 자동 초기화됨
    • 함수가 종료되어도 메모리에 남아 있음
    • 따라서 값이 계속 1씩 증가해 1, 2, 3 순으로 출력됨

특징

  • 함수 안에서만 사용할 수 있다는 점 빼고는, 전역 변수와 공통점이 많음
    • 프로그램의 시작부터 종료까지 저장공간이 계속 유지됨
    • 초기화하지 않으면 0으로 자동 초기화됨
    • 메모리의 데이터 영역에 위치

연습문제

다음 문장에서 설명이 틀린 것을 모두 고르세요.

  1. 지역 변수는 선언된 함수가 반환되면, 할당된 저장 공간이 자동으로 회수된다.
  2. 전역 변수와 정적 변수는 프로그램이 실행되는 동안 계속 저장 공간을 유지한다.
  • 셋 다 옳은 설명.
  1. 정적 지역 변수와 전역 변수는 변수의 사용 범위가 같다.
  • 옳지 않은 설명
    • 정적 지역 변수는 선언된 함수 내에서만 사용 가능
    • 전역 변수는 프로그램 전체에서 사용 가능
  1. auto를 사용한 지역 변수는 저장 공간 할당과 동시에 0으로 자동 초기화된다.
  • 옳지 않은 설명
    • 정적 변수, 전역 변수만 0으로 자동 초기화됨
  1. 하나의 함수 내에서는 같은 이름의 변수를 선언할 수 없다
  • 옳지 않은 설명
    • 반복문, 조건문 등으로 인해 블록을 새로 여는 경우에는 선언할 수 있음
    • 다만, 블록이 없는 일반적인 경우에는 선언할 수 없음
  1. 전역 변수와 지역 변수는 같은 이름을 사용할 수 있으나 전역 변수에 우선권이 있다
  • 옳지 않은 설명
    • 현재 함수의 지역 변수에 우선권이 있음
profile
뭔가 만드는 걸 좋아하는 개발자 지망생입니다. 프로야구단 LG 트윈스를 응원하고 있습니다.

0개의 댓글