C

[내배캠자습]C언어 챕터 6-5 : 변수의 종류

BreadMushroom 2026. 3. 29. 10:25

변수의 종류

변수에는 지역 변수/전역 변수가 있습니다. 여기에 static이나 const, extern 같은 키워드가 붙어서 조금씩 뉘앙스가 달라집니다.

지역 변수(Local Variable)

블럭 스코프 내에 선언된 변수. 따라서 스택 메모리에 저장됩니다. 함수가 종료되면 스택 프레임이 반환되면서 더이상 접근 불가능합니다.

지역 변수와 함수 마을

함수를 하나의 마을이라고 생각해봅시다. main() 마을에서는 Add() 마을에서 선언된 지역 변수 A를 접근할 수 없습니다. 그리고 Add() 함수가 종료되면, 지역 변수 A도 사라진다고 이해합시다.

Ex060501) 지역변수

다음의 소스코드를 명령어 순서 파악으로 출력 결과를 예측해봅시다. 예측 결과와 실행 결과와 비교해봅시다.

// Main.c

#include <stdio.h>

int add(int A, int B);

int main(void)
{
	int A = 2, B = 5;
	int Result;
	Result = add(A, B); // 변수 A, B가 전달되는 걸까요?
	printf("add(A, B) == %d", Result);

	return 0;
}

int add(int A, int B) 
{
	// int A와 int B는 지역 변수일까요?
	int Result = A + B;
	return Result;
}

int A=2, int B=5의 값이 복사되어서
add함수에 매개변수로 전달된다.
그 복사된 변수값으로 계산을 한 후
계산값을 함수를 호출한 부분에 반환해 주는것
만약 add함수에 반환값이 없다면 
printf("add(A, B) == %d", Result); 이 부분의 %d 정상적으로 출력되지 않음

즉 main 함수의 int A와 add 함수의 int A는 다른 존재라는 것.

정적 지역 변수

지역 변수 앞에 static 키워드가 붙으면 데이터 섹션에 저장됩니다. 즉, 함수 종료시 접근 불가한 스택메모리에 저장되는게 아닙니다. 함수가 종료되어도 값이 유지가 됩니다 이런 변수를 정적 지역 변수라고 부릅니다.

전역 변수(Global Variable)

파일 스코프에 선언된 변수. 데이터 섹션에 저장됩니다.

Ex060502) 전역 변수

다음의 소스코드를 명령어 순서 파악으로 출력 결과를 예측해봅시다. 예측 결과와 실행 결과와 비교해봅시다.

// Main.c

#include <stdio.h>

int GResult;

void StoreSum(int A, int B);

int main(void)
{
    int A = 2, B = 5;
    StoreSum(A, B);
    printf("GResult == %d", GResult);

    return 0;
}

void StoreSum(int A, int B)
{
    GResult = A + B;
    return;
}

 

이것도 Storesum 함수가 반환값을 주고 있지 않으니
GResult = int A + int B의 계산값이 사라질 것이라 생각할 수 있지만
GResult 변수는 지역변수가 아닌 전역변수로 선언되어 있기 때문에 
함수의 계산값을 반환해 주지 않는다고 해서 변수에 저장된 값이 사라지지않는다.
즉 Storesum 함수가 반환값을 안줘도 GResult 변수의 계산된 값이 그대로
저장되어 있는 것.

Ex060503) 정적 지역 변수와 전역 변수

다음의 소스코드를 명령어 순서 파악으로 출력 결과를 예측해봅시다. 예측 결과와 실행 결과와 비교해봅시다.

// Main.c

#include <stdio.h>

int GCokeCount = 0;

void MakeCoke(void);

int main(void)
{
	MakeCoke();
	MakeCoke();
	MakeCoke();

	return 0;
}

void MakeCoke(void)
{
	static int SCokeCount = 0;
	int CokeCount = 0;

	printf("GCokeCount: %d\\n", GCokeCount);
	printf("SCokeCount: %d\\n", SCokeCount);
	printf("CokeCount: %d\\n\\n", CokeCount);

	++GCokeCount;
	++SCokeCount;
	++CokeCount;
}

처음 봤을 때 이해가 안가고 너무 어려웠는데
다시 보니까 정말 쉽게 느껴지는게 제일 체감된 파트였다.

정적 전역 변수

만약 전역 변수 앞에 static 키워드가 붙는다면, 해당 변수는 해당 파일 내에서만 접근 가능합니다.

// Main.c

#include <stdio.h>

static int A;

int main(void)
{

	return 0;
}

// MyMath.c

#include "Main.c"

void PrintA(void)
{
	printf("%d", A); // 다른 파일에 정적 전역 변수로 선언된 A이므로, 접근 불가.

	return;
}

const 변수

const 키워드가 붙은 변수. 초기화 이후에 값을 변경할 수 없습니다. 초기화가 강제됩니다.

const 키워드의 필요성

// Main.c

#include <stdio.h>

int main(void)
{
	double PI = 3.141592;
	
	// ... 200만줄의 유인우주선 개발 코드 ...
	
	PI = 3.15; // 절대 하면 안됩니다. 그래서 const 키워드가 필요한 것입니다.
	
	// ... 200만줄의 유인우주선 개발 코드 ...

	return 0;
}

Ex060504) const 키워드

다음의 소스코드를 명령어 순서 파악으로 출력 결과를 예측해봅시다. 예측 결과와 실행 결과와 비교해봅시다. 각 변수들이 메모리 레이아웃 어디에 저장될지도 생각해봅시다. 문제가 생긴다면 어디서 왜 발생하는지 생각해봅시다.

// Main.c

#include <stdio.h>

const int GConstVar = 7;

const static int SConstVar = 14;

int main(void)
{
	const int LocalConstVar = 10;

	LocalConstVar = GConstVar * 2;
	GConstVar = LocalConstVar * 2;
	SConstVar = GConstVar * 3;

	printf("%d %d %d", GConstVar, SConstVar, LocalConstVar);

	return 0;
}

const 키워드를 사용하면 처음에 변수에 초기화 한 값을 변경시킬 수 없기 때문에
변수에 값을 다시 대입하려고 하면 문제가 발생하게 된다.