자 이제 3장이 끝났고, 4장을 공부하자~~
전역 변수로 설정하면 어느 위치에서던 사용할 수 있다. 그만큼 장점이 있는 것인데, 그만큼 위험하다. 어떻게든 사용하지 않으려고 노력해야 한다.
#include <iostream>
using namespace std;
// 전역 변수 (global variable)
int value = 12;
int main()
{
cout << value << endl;
// 지역 변수 (Local variable)
int value = 1;
cout << value << endl;
return 0;
}
output : 12
1
전역 변수의 개념과 지역 변수의 개념을 제대로 이해해야 한다. 첫 cout << value << endl;
에서 12
가 나온 이유는 지역 변수가 선언되지 않고, 전역 변수가 선언되어 있으므로 전역 변수의 값이 들어가게 된다.
여기서 질문!!!!
-> 그렇다면 두번째 cout << value << endl;
에서 value 값을 전역변수 값으로 사용하고 싶다면 어떻게 해야 하는가?
#include <iostream>
using namespace std;
// 전역 변수 (global variable)
int value = 12;
int main()
{
cout << value << endl;
// 지역 변수 (Local variable)
int value = 1;
cout << value << endl;
cout << ::value << endl;
return 0;
}
output : 12
1
12
cout << ::value << endl;
를 사용하여 전역변수 값을 갖고 올 수 있다.
#include <iostream>
using namespace std;
void doSomething()
{
int a = 1;
++a;
cout << a << endl;
}
int main()
{
doSomething();
doSomething();
return 0;
}
output : 2
2
이와 같이 출력되는 것을 볼 수 있다. 이는 우리가 지금까지 봐왔던 내용과 거의 동일하다. 하지만 함수의 초기화 부분에 static int
로 선언하면 어떻게 되는가?
이 두 코드는 똑같은 출력을 냅니다. 과연 이게 무슨 뜻일까?
static
이 도대체 무엇일까?
static int a = 1은 무슨 말일까?
변수 a가 os로 부터 받은 메모리가 static 이라는 뜻이다. 또한, static은 무조건 특정 값으로 초기화를 해주어야 한다. 이것이 static의 특징이다.
나중에 객체지향을 하면서 제대로 이해해 보도록 하자. static같은 경우는 메모리 관점으로 생각하면 이해하기 편하다. 나중에 객체지향을 쓸 수 있다면 전역 변수를 사용하지 않고 프로그래밍을 할 수도 있다.
Linking : 연결시킨다라는 의미를 갖음. 컴파일할 때 c++파일 여러개가 있으면 각각 컴파일하여 obj파일 만들고 걔네들 끼리 연결해준다.
Linkage : 연결 자체를 의미한다.
internal Linkage : 개별 c++파일 안에서만 전역으로 작동하는 전역변수를 의미한다.
자, 여기서 눈여겨 봐야 되는 것이 있다. 우리가 source 파일에 c++파일을 만들어 함수를 저장한 것이 생각날텐데, 이 경우에 main()함수가 있는 본문에 void doSomething()
을 사용한 것이 보일 것이다. 근데 이는 앞에 무언가가 생략되어 있는데, 생략되어 있는 것은 바로 이것이다. extern
extern void doSomething()
즉, 어딘가에 doSomething()이라는 몸체가 존재하는데, 이것이 어딘가 존재한다라는 의미이다. 변수도 똑같이 선언하여 사용할 수 있다.
이 코드는 LINK error가 난다. 무엇때문일까? 바로 메모리 할당 때문에 문제가 생긴다. test.cpp에서 extern int a;
라 선언을 하지만, 선언만 했을 뿐 초기화를 하지 않은 상태인 것이다. 그러다 보니 메모리를 갖지 않은 상태
초기화를 해주고 코딩을 하면 문제 없이 실행된다. 여기서 주의해야할 점들이 있다. 무엇일까? 초기화를 두번 해주면 문제가 발생한다는 것이다.(이것도 LINK error을 발생시킨다.)
test.cpp파일은 그대로 둔 체로 Practice_4_2.cpp파일의 a를 456으로 초기화 하고 실행했더니 LINK error가 뜨며 문제를 발생시킨다.
링크 에러는 발생하면 그 문제점을 찾기가 매우 힘들어서 최대한 기본 개념을 제대로 숙지하고 있는 것이 좋다.
/*
int g_x; --->>> external linkage
static int g_x --->>>> internal linkage
contst int g_x ---->>>> const를 사용할땐 항상 특정한 값으로 초기화를 해줘야 한다.
extern int g_z
extern const int g_z;
int g_y(1);
static int g_y(1);
const int g_y(1);
extern int g_w(1)
extern const int g_w(1)
*/
이 부분은 좀더 공부를 해야 확실히 내 것으로 만들어 질듯.. 쉽지 않네