• 4.2.1 전역 변수(Global Variables)
  • 4.2.2 정적 변수(Static Variables)

4.2.1 전역 변수(Global Variables)

 

전역 변수란 함수 내에서 정의되지 않고 어디에도 종속되지 않은 변수를 뜻한다. 코드상에서 어느 중괄호 안에도 안 들어가면 전역 변수가 된다. 초기 할당이 진행되었다면 프로그램이 끝날 때까지 존재하며 extern 키워드를 사용하면 모든 파일에서 접근이 가능하다.

#include <iostream>

using namespace std;

// global variable
int value = 123;

int main()
{

	// 전역 변수가 출력
	cout << value << endl;

	// name hiding
	int value = 1;

	// 영역 연산자(전역 변수를 출력시킨다)
	cout << ::value << endl;

	// 지역 변수가 출력
	cout << value << endl;

	return 0;
}

전역 변수 value가 할당되고나면 접근이 가능해지는데, 지역 변수가 동일한 이름으로 작성되면 name hiding으로 인해 지역 변수를 먼저 접근하게 된다. 하지만 영역 연산자 ::를 사용하게 되면 지역 변수가 아닌 전역 변수로 접근해서 데이터를 사용할 수 있다.


4.2.2 정적 변수(Static Variables)

 

정적 변수도 할당이 되면 프로그램이 끝날 때까지 존재하기 때문에 전역 변수와 비슷하다고 생각될 수 있지만 조금 특성이 다르다. 정적 변수는 최초 초기화는 반드시 소스 파일에서 해야 하는 특징이 있다. 또한 정적 변수의 경우 선언된 파일 안에서만 사용이 가능하고 선언된 파일 이외에서는 사용이 불가능하다.

#include <iostream>

using namespace std;

// 해당 cpp 안에서만 전역으로 사용하는 변수 다른 곳에서는 접근 불가능
static int static_global_variable = 1;

void doSomething()
{
	// 정적 변수(메모리가 static이다, 메모리가 정적으로 선언된다)
	static int a = 1;
	++a;
	cout << a << endl;
}

int main()
{
	cout << "정적 변수 테스트" << endl;
    
	// 정적 변수 테스트
	doSomething();
	doSomething();
	doSomething();
	doSomething();

	return 0;
}

정적 변수는 특정 함수가 몇번 호출되는지 디버깅할 때 쓰면 유용하다. 전역 변수 같지만 선언된 함수 블럭 내에서만 같은 메모리를 사용하며, 함수 내부에 선언되어 있다면 외부에서는 접근할 수 없다. 물론 전역 변수의 위치에서 선언하면 전역 변수처럼 접근하겠지만 이마저도 초기화된 파일에서만 가능하지 외부 파일에서의 접근은 불가능하다. 이러한 특징 때문에 내부 연결(Internal Linkage)라고 한다.

C++를 처음 접하면 using이라는 키워드는 namespace를 코드에서 작성하기 귀찮아서 빼기 위해 사용하는 경우가 많다.

using namespace std;

하지만 typedef와 비교가 되는 사용법이 있어서 이번 포스팅으로 정리하도록 한다.


typedef를 활용한 변수 별칭 만들기

 

typedef를 사용하는 것은 자료형에 대해 별칭을 만들기 위함이다. 예를 들어 double에 대해서 거리라는 의미를 가지도록 하기 위해 사용한다. 이렇게 사용하는 것이 추후 거리를 의미하는 모든 변수가 float 자료형으로 변경되어야 할 때 한 줄만 바꾸면 되기 때문에 유지보수를 위해서도 사용하는 편이다.

typedef double distance_t;

using을 활용한 변수 별칭 만들기

 

using을 사용하는 것도 typedef를 사용하여 별칭 만드는 것과 목적은 같다. 사용하는 방법은 아래와 같다.

using distance_t = double;

typedef와 using의 차이점

 

C/C++를 사용하지 않는 프로그래머에게 코드를 보여주었을 때 using 키워드의 경우 직관적이라 가독성이 좋다. 그리고 가장 큰 차이점은 using 키워드는 template을 지원한다는 점이다.

template<typename T>
using distance_t = T; // 템플릿 사용 가능

template<typename T>
typedef T distance_t; // 템플릿 사용 불가능

C++ 11 이상이고 template을 사용하게 되는 경우 using 키워드를 사용하는 것이 더 좋을 것이다.


Reference

  • 4.1.1 지역 변수(Local Variables)
  • 4.1.2 지역 변수의 범위와 지속기간(Scope and Duration)

4.1.1 지역 변수(Local Variables)

 

지역 변수란 함수 내에서 정의된 변수를 뜻한다. 우리가 C++를 다룰 때 가장 흔하게 쓰는 main 함수도 함수이므로 main 함수 내부에 정의한 변수 또한 지역 변수가 된다. 

#include <iostream>

int main()
{
	using namespace std;

	int apple = 5;

	cout << apple << endl;

	return 0;
}

코드에서 apple이 지역 변수가 되겠다.


4.1.2 지역 변수의 범위와 지속기간(Scope and Duration)

 

지역 변수는 사용할 수 있는 범위와 지속기간이 존재한다. 지역 변수의 범위란 변수에 접근할 수 있는 위치를 의미하고 지역 변수의 지속기간은 변수가 생성되고 소멸하는 위치를 말한다.

 

우선 지역 변수의 지속기간을 확인해보자!

#include <iostream>

int main()
{
	using namespace std;

	int apple = 5; // 지역 변수 생성

	cout << apple << endl;

	return 0; // 지역 변수 소멸
}

앞의 예제에서 지역 변수의 생성과 소멸에 대한 위치를 표시하였다. 지역 변수가 초기화되는 순간 생성되고 함수를 벗어나게 되는 순간에 지역 변수는 소멸하게 된다.

 

지역 변수의 범위에 대해서는 여러가지 케이스로 한번 확인해보자!

#include <iostream>

int main()
{
	using namespace std;

	apple = 1; //error

	int apple = 5;

	cout << apple << endl;

	return 0;
}

지역 변수가 정의되기 이전에 사용하는 것은 불가능하다. 아직 apple이라는 변수가 생성되기 이전이기 때문에 접근할 수 없는 범위가 된다.

 

#include <iostream>

int main()
{
	using namespace std;

	int apple = 5;

	cout << apple << endl;

	return 0;
}

apple = 3; // error

함수 밖에서는 사용할 수가 없다. main 함수를 거치면서 이미 생성이 되었지만 소멸도 수행되면서 apple이라는 변수가 삭제되었으므로 접근할 수 없는 범위이다.

 

#include <iostream>

int main()
{
	using namespace std;

	int apple = 5;

	cout << apple << endl;

	{
		apple = 1;
		int apple = 3; // 내부 apple 생성
		cout << apple << endl;
	} // 내부 apple 소멸

	//apple에 커서 올리면 같은 apple이 표시된다.
	cout << apple << endl;

	return 0;
}

이번에는 내부 블럭을 하나 더 생성한 뒤에 apple이라는 지역 변수를 하나 더 생성해주었다. 이 경우 apple이 두 개가 존재하는데, 가장 가까운 범위에서 정의된 apple을 사용하게 된다. 이러한 말이 어려울 수 있는데, 요즘 visual studio는 이 부분에 대해 서포트를 해준다.

변수 클릭을 하면 같은 변수에 대해 표시해준다.

위처럼 변수를 클릭하면 같은 메모리를 가리키는 변수에 대해 친절하게 표시해준다.

+ Recent posts