전역변수(Global Variable)

cpp파일 모두에서 사용할 수 있는 변수를 전역변수(Global Variable)이라 한다.
전역변수는 가급적 사용을 하지 않아야 한다.
부득이한 경우로 사용할 상황도 생긴다.

정적변수(Static Variable)
디버깅,테스트할때 자주 사용한다.
변수 선언할때 static을 선언해 준다.
정적변수는 초기화해 사용해야 한다.

전역변수와 정적변수의 차이점

static이 없으면 일정 범위 안에서 변수가 선언될 때 메모리를 할당받고 반납하고 반복한다.
여러 함수에서 전역변수를 수정하면 문제가 생길 수 있다.

static이 있으면 영역안에 변수가 선언될 때 메모리를 할당받고 초기화하지 않는다.
변수가 선언되어있으면 재사용한다.

지역변수(local vriable),정적변수(static vriable)는 
{} 지역 안에서 사용하기 때문에 변수가 다른 곳에 영향을 주지 않는다.


내부연결
전역변수를 cpp 안에서만 사용하게 하려면 static을 선언해준다.
한 cpp파일에서만 전역변수가 사용되는 것은 내부연결(Internal Linkage)이라고 한다.

외부연결
extern선언을 이용해 여러 cpp파일에서 한 변수, 함수를 사용할 수 있다.

static : 다른 cpp 파일로부터 접근이 안된다.
const : 값을 변경 못한다.
extern : 다른 cpp파일에서 접근이 가능하다. 초기화하면 다른 곳에선 초기화를 해주면 안 된다.
extern const: 다른 cpp파일에서 접근 가능하다. 초기화해주어야 한다.

 

MyConst.h

#pragma once
//#pragma once 헤더 파일 중복 include를 막아준다.

namespace Constants
{
	//전체적으로 사용되는 상수를 선언한다.
	extern const double pi;
	extern const double grivity;

}

main.cpp

#include <iostream>
#include "MyConst.h"

using namespace std;

//전역변수 선언
int a = 123;
//정적변수 선언
void getTest()
{
	//정적변수는 꼭 초기화해야한다.
	static int a = 1;
	++a;
	cout << a << endl;
}

//다른 cpp 함수,변수 사용하기
//forward declaration
//어딘가에 있을 함수를 찾는다.
//extern 선언이 생략되어 있다.
//extern void getCppTest();
//프로그램전체에서 확인한다.
void getCppTest();
extern int a2;

int main()
{
	//전역변수(Global variabel)이 출력된다.
	cout << a << endl;
	//지역변수(local variabel)이다.
	//범위가  {}로 정해진다.
	int a = 0;

	//지역변수(Global variabel)가 출력된다.
	cout << a << endl;

	//전역연산자를 사용하면 전역변수로 출력기가능하다.
	cout << ::a << endl;

	//static을 선언해 정적변수를 사용하기 Test
	//getTest()함수를 불러오면
	//static int a를 메모리에 할당받는다.
	getTest();
	//두번째 함수 출력때 static이 있으면 변수가 선언되 있으면 재사용한다.
	getTest();

	getCppTest();

	cout << a2 << endl;
	//header에 상수를 선언해 test에서 불러오면 Constants와 메모리 주소가 다르다.
	//cpp파일을 만들어 extern header엔 정의만하고 cpp 파일에서 extern으로 정의해주면
	//같은 메모리 주소를 사용하는 걸 볼 수 있다.
	cout << "main : " << Constants::pi << " 주소: " << &Constants::pi << endl;
	return 0;
}

MyConst.cpp

namespace Constants
{
	//전체적으로 사용되는 상수를 선언한다.
	extern const double pi(3.141592);
	extern const double grivity(9.8);

}

test.cpp

#include <iostream>
#include "MyConst.h"

//초기화를 해줘야한다.
extern int a2 = 0;
void getCppTest() 
{
	using namespace std;
	cout << "test : " << Constants::pi << " 주소: " << &Constants::pi << endl;
	
}

+ Recent posts