[ C++ ] Chapter 4.2 : 전역 변수, 정적 변수, 내부 연결, 외부 연결
#전역 변수
*사용을 자제해야한다. 다른 cpp파일에도 영향이 가기 때문이다.
함수 외부에서 선언된 변수를 전역 변수라 한다.
*Global Scope Operator 영역 연산자 '::' 를 사용하여 전역 변수에 접근할 수 있다.
int value = 0;
int main()
{
int value = 1;
cout << value << endl; // 지역 변수 접근
cout << ::value << endl; // 전역 변수 접근
}
#정적 변수 static Variable
*디버깅하거나 캐스팅할때 사용에 용이?
*초기화가 꼭 필요하다.
정적으로 같은 메모리 주소를 사용하고, 초기화를 한번만 하는 변수다.
#내부 연결 Internal Linkage
개별 cpp파일안에서만 전역으로 작동하는 전역 변수다.
static int a = 0;
int main() {
// 내부 연결
}
static 키워드가 다른 cpp파일에서 사용하지 못하도록 막아주는 역할을 한다.
같은 내부 파일에서는 어디든 접근할 수 있다.
#외부 연결 External Linkage
외부 cpp파일에서 함수나 변수를 사용할 수 있도록 한다.
extern 키워드로 foward declaration 을 통해 외부의 함수나 변수를 사용한다.
extern int a = 0;
int main() {
// 외부 연결
}
#네임스페이스를 통해 헤더파일의 변수를 가져와 사용할 때는..
##MyConstant.h
namespace Constants
{
const double pi(3.141592);
const double gravity(9,8);
}
##main.cpp
#include "MyConstants.h"
int main()
{
cout << Constants::pi << endl;
}
*헤더파일의 변수들은 extern 키워드가 붙지 않았다.
따라서 같은 이름의 사본이 만들어진 것 뿐, 같은 메모리 주소의 변수가 아니다.
이와 같이 헤더파일이 다른 cpp파일에서 1000번 사용된다면, 다른 메모리 주소를 가지고 있는 변수 1000개가 생기는 것이니 심한 메모리 낭비가 된다.
결과적으로 값이 바뀔 일이 없는 const 변수이기 때문에, extern 키워드를 붙여서 같은 주소의 메모리를 공유하여 사용하도록 하자.
#정리
extern 키워드가 생략된 전역 변수
- 다른 파일에서 사본으로 사용한다. 때문에 메모리를 별개로 사용.
extern 키워드가 붙여진 전역 변수
- 다른 파일에서도 원본을 사용. 때문에 같은 주소의 메모리를 사용.