[Programming Basic] 지역 변수, 전역 변수, 정적 변수

양영준·2026년 2월 24일

Programming Basic

목록 보기
6/6
post-thumbnail

📌 지역 변수 (Local Variable)

지역 변수 (Local Variable)은 함수나 중괄호(블럭) 내에서 선언되는 변수를 뜻한다.
지역 변수에서 지역의 의미는 함수나 중괄호 내부를 뜻하므로 해당 지역 내부에서만 접근 가능하다.
지역 변수는 해당 지역에 진입 / 호출될 때마다 새롭게 할당되며, 지역을 빠져나가면 자동적으로 소멸한다.
지역 변수는 초기화하지 않으면 컴파일 에러를 발생하거나 쓰레기 값이 저장된다.
각 지역에서 동일한 이름을 가진 지역 변수는 선언할 수 있지만 하나의 지역 내에서 동일한 이름을 가진 지역 변수는 선언할 수 없다.

#include <iostream>

using namespace std;

int main()
{
	int a = 20;

	for (int a = 10;a < 13;a++)
	{
		cout << a << endl;
	}
}

a 라는 동일한 이름을 가진 지역 변수를 두 번 선언했으나 하나는 main() 에서, 다른 하나는 for 문 내부에서 선언했기 때문에 다른 지역에서 지역 변수를 선언한 것이 된다.
따라서 두 지역 변수 a 가 각각 고유한 메모리 값을 가진다.

📌 전역 변수 (Global Variable)

전역 변수 (Global Variable)는 함수 외부에 선언되는 변수를 뜻한다.
어느 지역에도 속해 있지 않는 변수이기 때문에 프로그램이 시작될 때 메모리 공간에 할당되고, 할당된 메모리는 프로그램이 끝날 때까지 유지된다. (수명이 프로그램과 동일하다.)
이 때 별도의 초기값이 없는 경우 0으로 초기화된다.
멀티 스레드 환경에서 전역 변수를 사용할 경우 lock 을 통해 다른 스레드에서 접근하지 못하도록 해야 안전하게 동작할 수 있다.

만약 전역 변수와 지역 변수의 이름이 같은 경우 지역 변수를 우선시 처리한다.

#include <iostream>

using namespace std;

int a;	//전역 변수는 초기값이 없는 경우 0으로 초기화

int main()
{
	cout << a << endl; //전역 변수 a 에 저장된 0 출력

	if (a == 0)
	{
		int a = 10;
		cout << a << endl;	//if 문 내부에서 선언된 지역 변수 a 에 저장된 10 출력
	}
}

코드 실행 결과

프로그램 전체에서 일관된 데이터를 유지 / 공유할 수 있지만, 가독성과 유지 보수성을 감소시킬 수 있다.

💡 extern

변수나 함수가 다른 파일에 선언되었음을 나타내는데 사용하는 키워드이다.
현재 파일에서 사용할 전역 변수가 다른 파일에서 선언되었음을 알리거나 다른 파일에 정의된 함수를 현재 파일에서 사용한다는 것을 알리는데 사용된다.

//소스코드1.cpp

int i = 0;
void Func() { printf("%d\n", i); }
//소스코드2.cpp

extern int i;
extern void Func();

void main()
{
	i = 10;
    Func();
}

extern 이 필요한 이유 ?

하나의 전역 변수를 쓰는 코드를 여러 개의 소스 파일로 분리해두었을 때, 전역 변수를 선언한 측의 코드에서는 오류가 뜨지 않지만, 선언하지 않은 측의 코드에서는 전역 변수를 참조하지 못하기 때문에 오류가 발생한다.

그렇다고 선언하지 않은 쪽에서 동일한 이름의 전역 변수를 추가한다면, 컴파일 시에는 오류가 없을지라도 링크할 때 프로젝트에 같은 이름의 전역 변수가 2개 존재하기 때문에 오류가 발생한다.

이러한 문제를 해결하기 위해 같은 프로젝트 안에 존재하는 전역 변수를 참조하기 위해서 extern 키워드를 사용한다.

사용 시 주의점

  1. 이미 선언한 전역 변수를 extern 해야한다.
    extern 키워드를 붙인 전역 변수가 선언되어 있지 않으면 오류가 발생한다.
  2. 같은 프로젝트 내에서 동일한 이름의 전역 변수 선언을 하지 않는다.
  3. extern 키워드를 붙일 때 값을 할당하지 않는 것이 좋다.
    전역 변수를 처음 선언할 때는 가능하지만, 이미 있는 전역 변수에 extern 키워드를 사용할 때에는 오류가 발생한다.

📌 정적 변수 (Static Variable)

정적 변수 (Static Variable)도 전역 변수와 마찬가지로 프로그램이 종료되기 전까지 메모리 할당이 해제되지 않으며, 지역을 벗어나도 사라지지 않고 유지되는 변수이다.

그러나 정적 변수는 전역 변수와 달리, 초기화가 딱 한번만 진행된다.
정적 변수는 변수가 맨 처음 사용될 때(최초 호출 시)만 초기화되고, 그 이후 프로그램 종료 시까지 메모리를 유지한다.

정적 지역 변수 (Static Local Variable)

함수를 호출할 때마다 새로운 메모리 공간을 할당 받지 않고, 처음 호출될 때 할당 받은 메모리 공간을 계속해서 사용하며, 프로그램이 종료될 때까지 유지되는 지역 변수를 의미한다.

정적 전역 변수 (Static Global Variable)

컴파일 시 딱 한 번 초기화되며, 접근 범위가 파일 내로 제한되어 다른 파일에서는 접근할 수 없는 변수를 의미한다.

정적 함수 (Static Function) ?
정적 전역 변수와 마찬가지로 접근 범위가 파일 내로 제한되어 다른 파일에서는 접근할 수 없는 함수를 의미한다.


Reference

전역 변수 - 위키 백과
[C언어] - 지역변수, 전역변수, static 변수
지역 변수와 전역 변수
c언어 정적변수, 지역변수, 전역변수 비교 (static, local, global)

profile
학습 내용 정리 순차적 갱신 / 정리 중

0개의 댓글