본문 바로가기

강의자료/C/C++

009. 변수의 스코프에 대해서 이해하자.

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


변수는 선언한 위치에 따라서 접근할 수 있는 범위가 정해지게 된다.
이 규칙을 정확하게 이해야만 코드를 어디에/어떻게 작성해야 하는지를 알게 되고, 이를 통해 전체 프로세스의 흐름을 이해할 수 있다.
그러므로 이는 꼭 알아야만 하는 필수 요소라고 할 수 있다.
#include  
using namespace std; 

int global = 16;
int global_copy = global;

namespace MyNameSpace
{
	int global = 1024; // namespace에 의한 이름중복 허용.
}

void main( )
{
	// 규칙1 : 변수는 중괄호를 벗어나는 순간 소멸한다.(특별한 경우 제외.)
	// 규칙2 : 상위 스코프의 변수에만 접근이 가능.
	// 규칙3 : 자신보다 먼저 선언된 변수에만 접근이 가능.
	// 규칙4 : 같은 영역에서는 중복된 이름의 변수를 생성할 수 없다.
	// 규칙5 : 이름이 중복될 경우, 가장 가까운 영역의 변수에 접근한다.

	// 변수 접근시 생명, 시야를 살펴봐야 한다.
	// - 변수가 소멸하면 접근 불가능.
	// - 변수가 보이지 않으면 접근 불가능.
	// - 즉, 변수에 접근하기 위해서는 해당 변수가 살아있고 보이는 위치에 있어야만 한다.

	// main함수의 지역변수는 전역변수에 가까운 라이프사이클을 가진다.

	// 파일규칙1 : 전역변수는 파일에 종속적이지 않다.
	// 파일규칙2 : 파일에 종속적인 전역변수를 만들기 위해서는 static 또는 이름없는 namespace를 사용해야 한다.
	// 파일규칙3 : 헤더파일에는 전역변수 생성코드를 넣어서는 안된다.(#include를 수행한만큼 변수가 중복 생성되기 때문)
	// 파일규칙4 : 다른 파일의 전역변수에 접근하기 위해서는 extern을 사용해야 한다.

	int local1;
	local1 = 100;
	cout << local1 << endl;

	{
		int local2;
		local2 = 200;
		cout << local1 << endl; // 1. 변수가 아직 살아있으므로 가능. 2. 시야가 내부->외부이므로 가능.
	}

	// cout << local2 << endl; // 1. 변수가 이미 소멸했으므로 불가능. 2. 시야가 외부->내부이므로 불가능.

	// 내부->외부
	global = 512;
	cout << global << endl;

	// 같은 이름일 경우,
	int global = 128;
	cout << global << endl;					// 지역변수 global이 출력.
	cout << ::global << endl;				// 전역변수 global이 출력.
	cout << MyNameSpace::global << endl;	// MyNameSpace에 있는 global이 출력.

	//===================================================
	// 반복문에서의 변수 스코프.
	//===================================================

	// 2단 출력.
	int num=1;
	while(num<=9)
	{
		cout << "2 X " << num << " = " << 2*num << endl;
		num++;
	}

	cout << endl;

	// 3단 출력.
	num=1;	// 같은 영역이므로 중복 생성 불가.
	while(num<=9)
	{
		cout << "3 X " << num << " = " << 3*num << endl;
		num++;
	}

	cout << endl;

	// 4단 출력.
	for(int num=1; num<=9; num++)
	{
		cout << "4 X " << num << " = " << 4*num << endl;
	}

	cout << endl;

	// 5단 출력.
	{
		int num=1;
		for(; num<=9; )
		{
			cout << "5 X " << num << " = " << 5*num << endl;
			num++;
		}
	}
}