C++기초

220324(2)_데이터 타입, 지역 변수와 정적 변수

hyrule 2022. 4. 5. 15:28
#include <iostream>


int g_Number = 100;


//전역 변수 테스트
int Add(int Number1, int Number2)
{
	return Number1 + Number2 + g_Number;
}

int Add(int Num1, int Num2, int Num3)
{
	return Num1 + Num2 + Num3 + g_Number;
}

int Add1(int Number1, int Number2 = 20)
{
	return Number1 + Number2;
}

float Add(float Number1, float Number2)
{
	return Number1 + Number2;
}


/*
//C++의 메모리 영역: 스택, 데이터, 힙, 코드의 4가지.
* 스택 영역: 함수의 인자 혹은 함수의 내부에서 선언된 변수들의 메모리가 할당되는 영역이다.
	함수의 내부에서 선언된 변수를 지역변수라고 한다.
	함수의 인자는 매개변수라고 한다.

* 데이터 영역: 전역변수, 정적(static)변수들의 메모리가 할당되는 영역이다.
*
	*전역변수: 함수의 외부에 선언된 변수를 의미한다.
	함수의 외부에 선언되어 있기 때문에
	일반적으로 변수명 앞에 g_(global)를 임의로 붙여 전역변수임을 표시해 준다.
	이렇게 전역변수를 선언하면 이 선언 아래에 있는 코드에서는 이 변수를 공용으로 
	사용할 수 있다.
	또한 전역변수는 값을 초기화 안 해주면 자동으로 0으로 초기화가 된다.
	지역변수는 해당 함수가 종료되면 스택에서 정리가 되지만
	전역변수는 프로그램이 종료될 때 메모리에서 정리가 된다.

	만약 선언해놓고 사용하지 않으면 불필요하게 메모리만 잡아먹으므로 
	신중한 사용이 필요하다.
	(선생님은 개인적으로 안 쓰신다고 함)

	* 정적(static)변수: 변수 타입 앞에 static을 붙여주면 해당 변수는 정적변수가 된다.
		- 정적 변수는 처음 한번만 초기화가 되고 그 다음부터는 초기화 코드가 무시된다.
		- 정적 변수는 초기화를 하지 않으면 자동으로 0으로 초기화가 된다.
		- 정적변수는 지역변수에 static을 붙여서 만들어주어도 해당 함수가 종료되면 메모리를 제거하는 것이 아닌 프로그램이 종료가 되어야 메모리에서 제거가 된다.

* 힙 영역: 동적할당된 메모리가 할당되는 영역이다. 'new'를 통해 만든 데이터는 전부 힙영역에 들어간다.
	필요할 때 공간을 할당하고 원할 때 메모리를 제거할 수 있다.
	동적할당 시 문제가 생길 수 있는 부분으로 메모리 단편화가 있다.
	cf)메모리 단편화에 대해 알아보기



* 코드 영역: 작성한 코드를 컴파일러가 바이너리코드(0, 1로 구성된 코드) 로 만들어 주고 이 바이너리 코드를 이용해서 실행파일을 만들어준다.
	실행파일을 더블클릭해서
	이때 실행파일을 구성하는 바이너리코드가 메모리에 저장되게 된다.
	이렇게 코드가 저장되는 영역을 코드영역이라고 한다.

*/



//전역 변수와 정적 변수 실험
void Test()
{
	int Number = 100;
	std::cout << "Test : " << Number << std::endl;
	++Number;
}
void TestStatic()
{
	static int Number = 100;
	std::cout << "TestStatic : " << Number << std::endl;
	++Number;
}


int main()
{
	std::cout << Add(10, 20) << std::endl;
	std::cout << Add(30, 40) << std::endl;
	std::cout << Add(3.14f, 21.374f) << std::endl;

	std::cout << Add1(50, 60) << std::endl;
	std::cout << Add1(50) << std::endl;



	TestStatic();
	Test();
	TestStatic();
	Test();
	TestStatic();
	Test();
	//Test() 에 선언된 Number 변수는 지역 변수로,
	//함수를 호출할 때마다 초기화되어 계속 100으로 출력되지만
	//TestStatic() 에 선언된 Number 변수는 정적 변수로,
	//함수를 처음 호출 할 때만 초기화되고 이후에는 초기화되지 않고 값이 더해진다.

	return 0;
}