수업 목표

  • 변수의 종류에 대해 배워본다.
  • static, const 키워드에 대해 자세히 배워본다.

변수의 종류

변수에는 지역 변수/전역 변수가 있습니다.

여기에 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;
}

 

<예상 출력값>

add(A, B) == 7

 

<실제 출력값>

add(A, B) == 7

 

 

정적 지역 변수

지역 변수 앞에 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;
}

 

<예상 출력값>

GResult == 7

 

<실제 출력값>

GResult == 7

 

 

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;
}

 

<예상 출력값>

GCokeCount: 0
SCokeCount: 0
CokeCount: 0

GCokeCount: 1
SCokeCount: 1
CokeCount: 0

GCokeCount: 2
SCokeCount: 2
CokeCount: 0

 

<실제 출력값>

GCokeCount: 0
SCokeCount: 0
CokeCount: 0

GCokeCount: 1
SCokeCount: 1
CokeCount: 0

GCokeCount: 2
SCokeCount: 2
CokeCount: 0

 

정적 전역 변수

만약 전역 변수 앞에 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;
}

<예상 출력값>

7 14 10

 

 

<예상 메모리 레이아웃>

스택 메모리

LocalConstVar

 

힙 메모리

 

데이터 섹션

GConstVar

SConstVar

 

코드 섹션

 

<실제 출력값>

const 값을 변경할 수 없어 컴파일 오류가 발생한다.

 

 

 

'C언어 공부 > C언어 강의' 카테고리의 다른 글

챕터 7-2 : 주소 연산자와 역참조 연산자  (0) 2026.03.06
챕터 7-1 : 포인터  (0) 2026.03.06
챕터 6-4 : 전방 선언  (0) 2026.03.06
챕터 6-3 : 스코프  (0) 2026.03.06
챕터 6-2 : [심화] 스택 프레임  (0) 2026.03.06

+ Recent posts