์ ์ญ๋ณ์์ ์ง์ญ๋ณ์๋ ๋ง์ด ๋ค์ด๋ณผ ์ฉ์ด์ด๋ค.
์ง์ญ๋ณ์๋ ํจ์ ์์์ ์ ์ธํ์ฌ ์ฌ์ฉํ๋ ๋ณ์์ด๊ณ ,
์ ์ญ ๋ณ์๋ ์ง์ญ๋ณ์์ ๋ค๋ฅด๊ฒ ์ ์ฒด์์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ธ ๋ค๋ฉด, ๊ฐ๋จํ๊ฒ ์ดํด๊ฐ ๊ฐ๋ฅํ๋ค
์ค์ ์ฝ๋์์๋ ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ง ์๋ค.
๊ฐ๋จํ ์์๋ฅผ ๋ค์ด๋ณธ๋ค๋ฉด
string globalVar;
void test()
{
string localVar;
}
์์น๋ง ๋ฐ๋๋ค๊ณ ์๊ฐํด๋ ๊ด์ฐฎ์ ์ ๋์ด๋ค. (๋ฌผ๋ก ๋ฌธ๋ฒ์ด ์ถ๊ฐ๋ ์๋ ์๋ค.)
๊ทธ๋ฌ๋ฉด ์ ์ (Static) ๋ณ์๋ ๋ฌด์์ธ์ง, ์ ์ญ๋ณ์๋ ์ฐจ์ด๊ฐ ๋ญ์ง ์์๋ณด๋ ค๊ณ ํ๋ค.
(์ง์ญ๋ณ์๋ ๋ฐ๋ก ์ ๋ฆฌํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์์ ํจ์ฐ ๐)
๊ฐ๋ ์ ๋ํ ์ค๋ช ์ ์๋์ ์์ธํ ์ ์๊ฑฐ๊ณ ,
๊ธํ ๋ถ๋ค์ ์ํด ์ด๋ป๊ฒ ์ฐ๋์ง๋ง ๋จผ์ ์ ๋ฆฌํ์๋ฉด
1. ์ ์ญ ๋ณ์ ์ฌ์ฉ
extern string globalVar;
2. ์ ์ ๋ณ์ ์ฌ์ฉ
static int globalVar;
์ด๋ ๋ค.
- ์ ์ญ๋ณ์๋?
- ์ ์ ๋ณ์๋?
1. ์ ์ญ๋ณ์ (Global Variable)๋?
์ํค๋ฐฑ๊ณผ: ์ ์ญ ๋ณ์๋ ์ด๋ค ๋ณ์ ์์ญ ๋ด์์๋ ์ ๊ทผํ ์ ์๋ ๋ณ์๋ฅผ ์๋ฏธํ๋ ์ ์ฐํ ์ฉ์ด์ด๋ค. ์ง์ญ ๋ณ์์ ๋๋น๋๋ ๊ฐ๋ ์ด๋ค.
์ ์ญ๋ณ์๋ ๋ง ๊ทธ๋๋ก ์ ์ญ์์ ์ฌ์ฉํ๋ ๋ณ์์ด๋ค
๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๋ ์์๋ ๋ฐ์ดํฐ ์์ญ์ ํฌํจ๋๋ ์น๊ตฌ์ด๋ค
ํ๋ก๊ทธ๋จ์ด ์์๋์ด ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น์ด ๋๋ฉด, ์ฃฝ์ ๋๊น์ง ๊ณ์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ ์น๊ตฌ์ด๊ธฐ๋ ํ๋ค
์ฌ์ค, ์ ์ญ๋ณ์๋ ์ฌ๋งํ๋ฉด ์ฌ์ฉํ์ง ์๋๊ฒ ์ฌ์ค ์ ์ผ ์ข๋ค (์ด์ ๋ ๊ธ ํ๋จ์ ์ฝ๋ฉํธ๋ก ์๊ธฐํ๊ฒ ๋ค)
์ ์ญ ๋ณ์์ ๋ํด ์๋์ ์ฝ๋๋ก ์์๋ฅผ ๊ฐ๋จํ ๋ค๊ฒ ๋ค
/* main.cpp */
#include <iostream>
using namespace std;
string globalVar;
void func1()
{
globalVar = "Hi";
}
void func2()
{
globalVar = "Bye";
}
int main(void)
{
func1();
func2();
cout << globalVar << "\n";
return 0;
}
๋๊ฐ๋ด๋ globalVar๊ฐ ์ ์ญ ๋ณ์๋ก ๋ณด์ธ๋ค
์ด์ผ~ ์ ๋ง ๊ฐ๋จํ๋ค์~
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์์ ์์์ฒ๋ผ ๋ชจ๋ ํจ์๋ฅผ ํ๋์ ํ์ผ์ ๋ฃ์ด๋์ง ์๋๋ค
๋๋ ํค๋ํ์ผ๊ณผ ์์ค ํ์ผ์ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ค (์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ธฐ๋ ํ๋ค)
์๋ฅผ๋ค์ด,
main.cpp, variable1.cpp, main.h ์ด๋ ๊ฒ ๊ตฌ์ฑ๋์ด์๋ค๊ณ ๊ฐ์ ํด๋ณด์
main.h
#include <iostream>
using namespace std;
string globalVar;
void func1();
void func2();
void func3();
main.cpp
#include "main.h"
using namespace std;
int main(void)
{
func1();
func2();
func3();
cout << globalVar << "\n";
return 0;
}
variable1.cpp
#include "main.h"
void func1()
{
globalVar = "My name is func1";
}
void func2()
{
globalVar = "My name is func2";
}
void func3()
{
globalVar = "My name is func3";
}
main.cpp ํ์ผ์์ ์ ์ํ๋ globalVar์ ํค๋ ํ์ผ์ ์ฎ๊ฒจ์ ํด๋ณด์๋ค
์ฎ๊ธฐ๊ธฐ๋ง ํ๋ฉด ๋๋๊ฑด๊ฐ~ ๋
์ธ์์ ํญ์ ํธ๋ฝํธ๋ฝํ์ง ์๋ค
release/variable1.o:(.bss+0x0): multiple definition of `globalVar'
release/main.o:(.bss+0x0): first defined here
์์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ง๋ ์ ์๋ค
์๋๋ฉด, ๋ณ์๋ฅผ ๊ตฌํ ํ์ผ์์ ์ ์ํ ๋ ํ์ผ ๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค
๊ทธ๋์ main.cpp์ variable1.cpp์์ ์ค๋ณต๋์ด globalVar๋ผ๋ ๋ณ์์ ์ธ์คํด์ค๊ฐ ์์ฑ๋์ด ์๋ฌ๊ฐ ๋๊ฑฐ๋ค
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ฅ์น๊ฐ ํ๋ ์๋ค
๋ณ์ ์์ " extern "์ด๋ผ๋ ๊ฒ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค
extern string globalVal;
์๋ ๊ฒ ์จ์ฃผ๊ธฐ๋ง ํ๋ฉด~
release/variable2.o: In function `func1()':
CPP_PRAC/variable/variable2.cpp:5: undefined reference to `globalVar'
? ๋ค๋ฅธ ์๋ฌ๊ฐ ๋ ์ ์ ์ ๋นํฉํ๋ฉด ๋ฉ๋๋ค
์ undefined reference (์ ์๋์ง ์์ ์ฐธ์กฐ) ๋ผ๋ ์๋ฌ๊ฐ ๋จ๋๋ฉด
extern์ ๋จ์ด ๋ป๋๋ก ์ธ๋ถ์์ ์ธ ์ ์๋ค๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ๋ง ํ๊ฑฐ๋ผ์
extern ๋ณ์๋ฅผ ์ ์๊ฐ ์๋๋ผ ์ ์ธ๋ง ํด์ค๊ฑฐ๋ผ์ ๊ทธ๋ ๋ค
๊ทธ๋ฅ globalVal๋ผ๋ ์ด๋ฆ์ด ์์ด~~ ์ฌ์ฉํ ๋ ค๋ฉด ์ฌ์ฉํด~~ ์ด๊ฑฐ๋ผ์,
๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์๋ ํ ๋น์ด ๋์ง ์์๊ฑฐ๋ค (→ ์ ์ธ๋ง ๋์ด์๋ค๊ณ ํํ ์๊ธฐํ๋ค)
๊ทธ๋์ ์ ์๋์ง ์์ ๊ฐ์ด๋ผ๋ ์๋ฌ๋ฅผ ๋ฑ์ ๊ฒ์ด๋ค
๊ทธ๋ฌ๋ฉด ๋ง ๊ทธ๋๋ ์ ์๊ฐ ์๋์ด์์ด์ ๋ฌธ์ ๋ผ๊ณ ํ๋, ์ฌ์ฉํ๋ ค๋ ์ ์ญ ๋ณ์๋ฅผ
ํ์ผ์ ์ ์ํด์ฃผ๋ฉด ๋๋๊ฑฐ๋ค
variable1.cpp
#include "main.h"
/* ์ ์ญ๋ณ์๋ก ์ ์ธ */
string globalVar;
void func1()
{
globalVar = "My name is func1";
}
void func2()
{
globalVar = "My name is func2";
}
void func3()
{
globalVar = "My name is func3";
}
์ด๋ ๊ฒ! ํด์ฃผ๋ฉด ์ปดํ์ผ์ด ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค
2. ์ ์ ๋ณ์ (Static Variable)๋?
์ ์ ๋ณ์๋ ์ ์ญ๋ณ์์ฒ๋ผ ํ๋ก๊ทธ๋จ ์์์ ํ ๋น๋์ด ์ฃฝ์ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ค
๋ํ ์ผ๋ฐ ์ ์ญ๋ณ์์ฒ๋ผ (extern ์ฌ์ฉํ์ง ์๋) ํ๋ฒ ์ ์ธํด์ฃผ๋ฉด ํธํ ์น๊ตฌ์ด๋ค
๋ณดํต ํด๋์ค์์ ๋ฉค๋ฒ ๋ณ์๋ก ๋๊ณ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, ๊ทธ๊ฑด ๋ค์์ ๋ค์ ๋ค๋ฃจ๋ ค๊ณ ํ๋ค
์ ์ ๋ณ์๋ ์ง์ญ๋ณ์๋ ๋น๊ตํ๋๊ฒ ๋ ์๊ธฐ ์ฝ๋ค
์ง์ญ๋ณ์ ์ฌ์ฉ
#include "main.h"
using namespace std;
int func1()
{
int globalVar = 1;
return globalVar++;
}
int main(void)
{
cout << func1() << endl;
cout << func1() << endl;
return 0;
}
์ง์ญ๋ณ์ ์ฌ์ฉ ๊ฒฐ๊ณผ
1
1
์ ์ ๋ณ์ ์ฌ์ฉ
#include "main.h"
using namespace std;
int func1()
{
static int globalVar = 1;
return globalVar++;
}
int main(void)
{
cout << func1() << endl;
cout << func1() << endl;
return 0;
}
์ ์ ๋ณ์ ์ฌ์ฉ ๊ฒฐ๊ณผ
1
2
์ฐจ์ด๊ฐ ๋ณด์ด๋๊ฐ,,,,,
๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ํ ๋น๋๊ธฐ ๋๋ฌธ์, ํจ์ ๋ฒ์์์์ ์ฌ์ฉํ์์ด๋
์ ์ ๋ณ์ ํค์๋์ธ " static "์ผ๋ก ์ธํด, ๋ฉ๋ชจ๋ฆฌ์ globalVar๋ผ๋ ๊ฐ์ด ๊ณ์ ๋จ์์์ด์
๊ฐ์ด ์ด๊ธฐํ ๋์ง ์๊ณ ์ฆ๊ฐ ํ์๋ค
(extern ๋ณ์์ฒ๋ผ ๋ค๋ฅธ ํ์ผ์์๋ ์ธ ์ ์๋๊ฑฐ๋ ์๋)
์ static int globalVar =1; ์ด๊ฑฐ๋ก ๋งค๋ฒ ์ด๊ธฐํ ๋๋๊ฑฐ ์๋๊ฐ์ค?
ํ ์ ์๋๋ฐ, ์ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ฆฌ ์ก์ ๋๋ง ์ฌ์ฉ๋ ์ด๊ธฐํ ๊ฐ์ด๋ผ์
๋งค๋ฒ ์ด๊ธฐํ ๋์ง๋ ์๋๋ค
์ฌ์ค ์ ์ ํด๋์ค ๋ฉค๋ฒ๋ณ์๊ฐ ์๋ ๊ทธ๋ฅ ์ ์ ๋ณ์๋ ๋ค๋ฃฐ ๋ด์ฉ์ด ๋ง์ง ์๋ค
๊ทธ๋์ ๋
์ ์ญ๋ณ์๋ ์ฌ์ฉ์์
์ธ์ ๋ด๊ฐ ์ ์ฅํ ๊ฐ(globalVar)์ด ๋ณ๊ฒฝ๋์๋์ง, ์ด๋ค ๊ฐ์ ์จ์ผํ๋์ง๋ ๋ชจ๋ฅด๊ธฐ์..
์ ์์ฐ๋ ๊ฒ์ด ์ข๋ค..
ํ์ง๋ง ์ ์ด๋ค๋ฉด, ์ฌ์ฉํ๊ธฐ์ ๋๋ฌด ํธํ๊ณ , ๊ผญ ์ฌ์ฉํด์ผํ ๊ฒฝ์ฐ๋ ์๋ค
๋ชจ๋ ์ค๋ ๋์ ํจ์์์ ๊ณต์ ํด์ผํ ๊ฐ์ด ์์ ์๋ ์๊ณ
์ฒ์ ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ , ๋ฐ๋์ง ์์ ๊ฐ์ ์ค์ ํด ๋์ ์๋ ์๋ค
์๋ฅผ ๋ค์ด, ํ๊ฒฝํ์ผ์ ๊ฐ์ด ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ ๋ก๋ํ ๋? ์ ๋.
๋๋ ๊ฐ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์ด๋ ๊ฑธ ์๊ณ ์, ๋ฎคํ ์ค ๊ฐ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ์๋ ์๋ค
ํ์ง๋ง ์ฒ์ ๊ฐ๋ฐ ์์ํ ๋๋ ์ข์ง ์์ ์ต๊ด์ด๋ผ์, ์ผ๋๋ง ํด๋๋ฉด ์ข์ ๋ฏ ํ๋ค ใ ใ
์ํค๋ฐฑ๊ณผ
ko.wikipedia.org/wiki/%EC%A0%84%EC%97%AD_%EB%B3%80%EC%88%98
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
multiple definition ์๋ฌ ์ฐธ๊ณ
stackoverflow.com/questions/14526153/multiple-definition-of-a-global-variable
undefined reference ์๋ฌ ์ฐธ๊ณ
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Boost Asio์ ๋ํด์ ์์๋ณด์ (4) | 2021.05.20 |
---|---|
C++ ํด๋์ค ๋ฉค๋ฒ๋ณ์ ์ด๊ธฐํ๋ฅผ ์์๋ณด์ (4) | 2021.03.25 |
C++ ๋๋ฌธ์/์๋ฌธ์ ๋ณํ (4) | 2021.02.26 |
C++ Function Object (ํจ์ ๊ฐ์ฒด)๋ฅผ ์์๋ณด์ (4) | 2021.01.22 |
C++ std::map์ ์ฌ์ฉํด๋ณด์ (4) | 2021.01.07 |