본문 바로가기
프로그래밍/C언어

C언어 - 지역 변수와 전역 변수, 정적 변수

by LostJourney 2024. 9. 4.
반응형

개요

C언어에서 변수를 선언하면 그 변수의 데이터가 메모리에 저장된다. 이때 변수를 선언한 위치와 특정 문법에 따라 저장된 데이터의 생존시간(lifetime)에 영향을 주게 된다. 이는 프로그램의 메모리 운용 방식과 유지 보수 및 효율성에 매우 중요하다.

오늘은 선언위치에 따른 변수의 종류 4가지를 알아보자

 


1. 지역 변수

지역 변수는 함수블록( 중괄호 {}를 뜻한다. ) 내부에서 선언된 변수로, 선언된 블록 내에서만 접근할 수 있다. 이 변수는 함수나 블록이 실행되는 동안에만 메모리에 존재하며, 해당 블록이 종료되면 자동으로 메모리에서 해제된다.

즉 블록이나 함수를 벗어나게되면 메모리에 지워지므로 그 변수에 접근을 할 수가 없게 된다.

스택 영역에 저장된다. 스택 영역이 뭔지 모르겠다면

2024.05.28 - [프로그래밍/컴퓨터 및 언어의 이해] - 메모리의 구조

 

메모리의 구조

개요우리가 프로그램을 실행할때 컴퓨터는 그 프로그램의 정보를 읽어 메모리에 로드한다. 이때 컴퓨터는 효율적인 활용을 위해 메모리에 각각의 공간을 설정하고 그 공간이 서로 상호작용을

carmen8740.tistory.com

이 글을 참고해 보자

 

예시)

#include <stdio.h>

void printLocal() 
{
    int localVar = 10;  // 지역 변수
    printf("지역 변수 값: %d\n", localVar);
}

int main() 
{
    printLocal();
    // printf("%d", localVar);  // 오류 발생: 'localVar'은 main 함수에서 접근할 수 없음
    return 0;
}

 

 


 

2. 전역 변수

전역 변수는 모든 함수 외부에서 선언된 변수로, 프로그램 내 모든 함수에서 접근이 가능하다. 프로그램이 실행되는 동안 메모리에 지속적으로 존재하며, 프로그램의 모든 부분에서 동일한 값을 공유한다.

프로그램 종료 시까지 그 파일 내에서 데이터가 지워지지 않는 것은 강력한 기능이나 그만큼 이름 중복이나 메모리관리가 어렵다는 단점이 있다.

데이터 영역에 저장된다.

 

예시)

#include <stdio.h>

int globalVar = 20;  // 전역 변수

void printGlobal() 
{
    printf("전역 변수 값: %d\n", globalVar);
}

int main() 
{
    printGlobal();
    globalVar = 30;  // 전역 변수 값 수정
    printGlobal();
    return 0;
}

 


 

3. 정적 지역 변수

정적 지역 변수는 함수 내에서 static 키워드를 사용하여 선언된 변수로, 일반적인 지역 변수처럼 함수 내에서만 접근할 수 있다. 그러나 이 변수는 함수가 호출될 때마다 초기화되지 않고, 함수가 호출될 때마다 그 이전의 값을 유지한다.

즉, 기억은 하되 블록 외부에서 접근은 불가능한 변수라 볼 수 있다.

데이터 영역에 저장된다.

 

예시)

#include <stdio.h>

void counter() 
{
    static int count = 0;  // 정적 지역 변수
    count++;
    printf("카운트: %d\n", count);
}

int main() 
{
    counter();
    counter();
    counter();
    return 0;
}

 


 

4. 정적 전역 변수

정적 전역 변수는 static 키워드를 사용하여 함수 외부에 선언된 변수로, 해당 변수가 선언된 파일 내에서만 접근할 수 있다. 즉, 다른 파일에서 이 변수에 접근할 수 없다. 이를 통해 전역 변수의 접근 범위를 제한하여 보다 안전한 코드 작성을 할 수 있다.

데이터 영역에 저장된다.

 

예시)

#include <stdio.h>

static int staticGlobalVar = 100;  // 정적 전역 변수

void printStaticGlobal() 
{
    printf("정적 전역 변수 값: %d\n", staticGlobalVar);
}

int main() 
{
    printStaticGlobal();
    return 0;
}

 


결론

종류 접근 범위 생존시간 저장 위치
지역 변수 변수가 선언된 블록 함수나 블록이 실행되는 동안 스택 영역
전역 변수 프로그램 내 모든 영역 프로그램이 종료될 때까지 데이터 영역
정적 지역 변수 변수가 선언된 블록 프로그램이 종료될 때까지 데이터 영역
정적 전역 변수 변수가 선언된 파일 프로그램이 종료될 때까지 데이터 영역

 

변수의 접근 번위와 생존시간의 개념을 파악하고 이해하는것은 굉장히 중요하다. 특히 전역 변수의 경우 초급자가 그 강력한 기능을 남발하여 여러 오류가 발생하는일이 비일 비재하다. 변수의 선언위치를 잘 파악하고 적절히 사용하여 코드의 안정성과 효율성을 높이도록 하자.

반응형

'프로그래밍 > C언어' 카테고리의 다른 글

C언어 - 동적할당  (2) 2024.10.22
C언어 - 포인터  (3) 2024.09.05
C언어 - 사용자 정의 자료형  (1) 2024.09.03
C언어 - 함수  (2) 2024.07.08
C언어 - 표준 입출력 스트림  (0) 2024.07.06