본문 바로가기
개인공부/C, C++

[C/C++] 지역변수/static 지역변수/전역변수 차이점(storage duration, scope)

by BuyAndPray 2021. 1. 26.
반응형

Storage duration/Scope

지역변수와 static 지역변수 그리고 전역변수들 간의 차이점을 알려면 먼저 storage durationscope라는 개념부터 알고 가야 한다.

  • Storage duration: 변수를 저장하는 공간이 존재하는 기간으로써 변수를 위해 메모리가 할당되고 변수가 다 사용되었을 때 메모리가 해제되는 기간을 말함
  • Scope: 변수가 참조될 수 있는 범위를 의미함

 

지역변수(Local variable)

C언어에서 지역변수(Local variable)란 아래와 같이 함수 내부에서 정의된 변수를 의미한다.

 

#include <stdio.h>

int func(){
	int local_variable = 3; // 지역변수
	
	return local_variable;
}

int main(int argc, char* argv[]) {
	printf("%d\n", func());
	return 0;
}

/*
Result
3
*/

 

지역변수는 아래와 같은 두 가지 특성을 가진다.

  • Automatic storage duration: 변수가 포함된 block이 실행될 때 메모리가 할당되고, block이 종료되면 메모리가 사라짐
  • Block Scope: block 내에서 변수가 선언될 때부터 block이 끝날 때까지 참조 가능

따라서 위의 예시에서 local_variable을 func 함수 바깥에서 사용하면 에러가 발생한다.

 

#include <stdio.h>

int func(){
	int local_variable = 3; // 지역변수
	
	return local_variable;
}

int main(int argc, char* argv[]) {
	printf("%d\n", func());
	printf("%d\n", local_variable); // error: ‘local_variable’ undeclared (first use in this function)
	return 0;
}

 

static 지역변수(Static local variable)

지역변수를 선언할 때 앞에 static을 붙이면 static 지역변수가 생성된다. 이 static 지역변수는 아래와 같은 특성을 지닌다.

  • Static storage duration: 프로그램을 compile 할 때 메모리가 할당됨. 그리고 프로그램 종료 시 메모리가 사라짐
  • Block Scope: block 내에서 변수가 선언될 때부터 block이 끝날 때까지 참조 가능

Static storage duration은 compile 할 때 메모리의 크기와 주소가 할당되고 프로그램 종료 시까지 이 메모리가 바뀌지 않기 때문에 프로그램이 실행될 때 값이 사라지지 않고 값을 저장하여 사용할 수 있다. 따라서 아래 예시에서 static 지역변수의 값은 초기화되지 않고 계속 증가된 상태로 유지된다.

 

#include <stdio.h>

int func(){
	int local_variable = 3; // 지역변수
	
	local_variable ++;
	
	return local_variable;
}

int static_func(){
	static int local_variable = 3; // static 지역변수
	
	local_variable++;
	
	return local_variable;
}

int main(int argc, char* argv[]) {
	printf("%d\n", func()); // 4
	printf("%d\n", static_func()); // 4
	printf("-------------------------\n");
	printf("%d\n", func()); // 4
	printf("%d\n", static_func()); // 5
	return 0;
}

/* Result
4
4
-------------------------
4
5
*/

 

전역변수(Global variable)

전역변수는 함수 바깥에서 선언하고 아래와 같은 특성을 지닌다.

  • Static storage duration: 프로그램을 compile 할 때 메모리가 할당됨. 그리고 프로그램 종료 시 메모리가 사라짐
  • File Scope: 변수가 선언될 때부터 파일이 끝날 때까지 참조 가능(선언 후 파일 내 모든 지점에서 참조 가능)

file scope을 가지기 때문에 선언 이후 파일 내 모든 지점에서 참조할 수 있다.

 

#include <stdio.h>

int global_variable;

void func1(){
	global_variable ++;
	printf("%d\n", global_variable); // 1
}

void func2(){
	global_variable *= 10;
	printf("%d\n", global_variable); // 10
}

void func3(){
	global_variable --;
	printf("%d\n", global_variable); // 9
	
}

int main(int argc, char* argv[]) {
	func1();
	func2();
	func3();
	return 0;
}

/* Result
1
10
9
*/

 

전역변수의 장점과 단점

  • 장점

전역변수는 여러 함수들이 공통으로 사용하는 변수를 설정할 때 사용하면 편리하다. 하지만 꼭 필요한 경우가 아니고서야 함수 자체의 parameter로 값을 넘겨주는 것이 좋다.

 

  • 단점

먼저 전역변수를 사용해 프로그램을 만든 뒤 전역변수를 수정해야 할 일이 생기면(ex 전역변수의 타입 변경) 전역변수가 사용되는 함수 각각의 내부에서 전역변수가 변경된 형식에 맞춰서 잘 실행되는지 체크해주어야 한다. 굉장히 귀찮다.

 

그리고 전역변수가 사용되는 함수들은 다른 파일에서 재사용하기 어렵다는 단점이 있다. 재사용하기 위해서는 다른 파일에서 동일한 전역변수를 만들어 주어야 한다.

 

출처

반응형

'개인공부 > C, C++' 카테고리의 다른 글

[C] GCC와 CC의 차이점  (2) 2021.02.12
[C/C++] scanf의 작동원리  (2) 2021.01.24
[C/C++] C언의 강점과 약점  (0) 2021.01.10

댓글