전역변수(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;
	
}

프로그램 메모리 주소

- 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재되어야한다.

- 당연히 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 있어야한다.


- 일반적인 컴퓨터의 운영체제는 메모리 공간을 네 가지로 구분하여 관리한다.

+ 코드영역 - 소스코드

+ 데이터영역 - 전역변수,정적변수

+ 힙영역 - 동적할당변수

+ 스택영역 - 지역변수,매개변수


전역변수

- 전역변수(Global Variable)란 프로그램의 어디서든 접근 가능한 변수를 말한다.

- main함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당된다.

- 프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있다.

- 메모리의 데이터영역에 저장된다.

실습내용

실습결과



지역변수

- 프로그램의 특정한 블록에서만 접근가능하다.

- 함수가 실행될때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제된다.

- 메모리의 스택(Stack)영역에 기록된다.

실습내용

실습결과



정적변수

- 정적변수(Static Variable)는 특정한 블록에서만 접근할 수 있는 변수이다.

- 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제된다.

- 메모리의 데이터 영역에 적재된다.

실습내용

실습결과



레지스터변수

- 레지스터변수(RegisterVariable)은 메인 메모리 대신 CPU의 레지스터를 사용하는 변수이다.

- 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장담할 수 없다.

실습내용

실습결과



함수의 매개변수가 처리될 때

- 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달한다.

- 전달 방식은 1: 값에 의한 전달 방식, 2 : 참조에 의한 전달 방식이 있다.

- 값에 의한 전달 방식은 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성된다.

+ 지역변수에 가깝다.

- 참조에 의한 전달 방식은 주소를 전달하므로 원래의 변수 자체에 접근할 수 있다.

+ 전역변수에 가깝다.

+ 매개변수로 포인터 변수를 보내는것이다.


실습내용

실습결과


+ Recent posts