์ ์ ์กด์ ๊ธฐ๊ฐ, ๋ด๋ถ ๋งํฌ
์๋ก ๋ค๋ฅธ ํ์ผ์์ ์๋ก ๋ค๋ฅธ ๋ณ์๋ค์๊ฒ ๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๋ฒ
๊ฐ์ ์ด๋ฆ์ผ๋ก ์ ์๋ ์ธ๋ถ ๋ณ์๋ฅผ ํ๋์ ํ์ผ์์ static ์ธ๋ถ ๋ณ์๋ก ์ ์ธํ๋ค๋ฉด, static์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ๊ทธ ํ์ผ์์๋ง ์ฌ์ฉ๋๋ ๋ณ์๋ก ์ธ์๋๋ค.
์ ์ ๊ธฐ์ต ์กด์ ์๊ฐ, ๋งํฌ ์์
๋ธ๋ก ์์์ static์ ์ฌ์ฉํ๋ฉด, static์ด ์ง์ญ ๋ณ์๋ฅผ ์ ์ ๊ธฐ์ต ์กด์ ์๊ฐ์ ๊ฐ๊ฒ ๋ง๋ ๋ค. ์ด๋ฐ ๋ณ์๋ค์ ๋ธ๋ก ์์์๋ง ์๋ ค์ง์ง๋ง ๊ทธ ๋ธ๋ก์ด ํ๋ํ์ง ์๋ ๋์์๋ ๊ณ์ ์กด์ฌํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ์ ์ง์ญ ๋ณ์๋ ํจ์์ ํธ์ถ๊ณผ ํธ์ถ ์ฌ์ด์์๋ ๊ฐ ๋ณด์กด ๊ฐ๋ฅ
๊ธฐ์ต ๊ณต๊ฐ ์ ํ์
auto(C++11์์๋ ์ ํ์์์ ๋น ์ง)
register
static
extern
thread_local(C++11์์ ์ถ๊ฐ๋จ)
mutable
ํ๋์ ์ ์ธ์๋ ์ ๋ชฉ๋ก์ ์๋ ์ ํ์๋ฅผ ํ๋๋ง ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ thread_local๋ง์ static ๋๋ extern๊ณผ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ
c++11 ์ด์ ์๋ auto ํค์๋๋ ์ด๋ค ๋ณ์๊ฐ ์๋ ๋ณ์๋ผ๋ ์ ์ธ์ ์ฌ์ฉ๋จ, ์ดํ์๋ ์๋ํ ๋ณํ์ ์ฌ์ฉ
register ํค์๋๋ ๋ ์ง์คํฐ ๊ธฐ์ต ๊ณต๊ฐ์ ์ง์ ํ๋ ์ ์ธ์ ์ฌ์ฉ๋จ.
c++11์์๋ ์๋ ๋ณ์๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ ๋ช ์์ ๋ฐฉ๋ฒ
static ํค์๋๋ ํ์ผ ๋ฒ์ ์ ์ธ์ ์ฌ์ฉ๋ ๋ ๋ด๋ถ ๋งํฌ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ง์ญ ์ ์ธ์ ์ฌ์ฉ๋ ๋๋ ์ง์ญ ๋ณ์๋ฅผ ์ํ ์ ์ ๊ธฐ์ต ์กด์ ์๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
extern ํค์๋๋ ์ฐธ์กฐ ์ ์ธ์ ๋ํ๋ธ๋ค. ๊ทธ ์ ์ธ์ ๋ค๋ฅธ ๊ณณ์ ์ด๋ฏธ ์ ์๋์ด ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค.
thread_local ํค์๋๋ ๋ณ์์ ์กด์ ์๊ฐ์ด ๋ณ์๋ฅผ ํฌํจํ๋ ์ค๋ ๋๊ฐ ์กด์ ์๊ฐ์ด๋ค.
Cv-์ ํ์
const
volatile
volatile ํค์๋๋ ํ๋ก๊ทธ๋จ ์ฝ๋๊ฐ ๋ณ๊ฒฝํ์ง ์๋๋ผ๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.
ex) ์ง๋ ฌ ํฌํธ๋ก๋ถํฐ ๋ค์ด์ค๋ ์๊ฐ์ด๋ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์๋ ํ๋์จ์ด ์์น๋ฅผ ์ง์ํ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ, ํ๋ก๊ทธ๋จ์ด ์๋๋ผ ํ๋์จ์ด๊ฐ ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ค.
mutable
mutable์ ํน์ ๊ตฌ์กฐ์ฒด(๋๋ ํด๋์ค)๊ฐ const๋ก ์ ์ธ๋์ด ์๋๋ผ๋ ํน์ ๋ฉค๋ฒ๋ฅผ ๋ณ๊ฒฝํ ์ ์์์ ๋ํ๋ธ๋ค.
struct data
{
char name[30];
mutable int accesses;
...
}
const data veep={"Clay cdd",0,...};
strcpy(veep.name,"Joef ef"); //ํ์ฉ x
veep.accesses++; //ํ์ฉ o
const์ ๋ํ ๋ณด์ถฉ
const ์ ์ญ ๋ณ์๋ ๋ด๋ถ ๋งํฌ๋ฅผ ๊ฐ๋๋ก ๋ํดํธ๋ก ๋ด์ ๋๋ค.
const int fingers = 10; //static const int fingers;์ ๊ฐ๋ค.
์๋ฅผ ๋ค์ด, ์ด๋ค ํค๋ ํ์ผ์ด ์์๋ค์ ์งํฉ์ ๊ฐ์ง๊ณ ์๊ณ , ํ๋์ ๋ค์ค ํ์ผ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ํ์ผ์ด ๊ทธ ํค๋ ํ์ผ์ ๋ชจ๋ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ . ์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํค๋ ํ์ผ์ ๋ด์ฉ์ ๊ฐ๊ฐ์ ์์ค ํ์ผ์ ํฌํจ์ํค๊ณ ๋๋ฉด, ๊ฐ ์์คํ์ผ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ค.
const int fingers=10;
const char *warning = "Wak!";
๋ง์ฝ ์ ์ญ const ์ ์ธ์ด ๋ณดํต์ ๋ณ์๋ค์ฒ๋ผ ์ธ๋ถ ๋งํฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ ์ญ ๋ณ์๋ ํ๋์ ํ์ผ์์๋ง ์ ์๋๋ฏ๋ก ์๋ฌ๊ฐ ๋๋ค.(ํ๋์ ํ์ผ๋ง์ด ์์ ๊ฐ์ ์ ์ธ์ ํ๊ณ ๋ค๋ฅธ ํ์ผ๋ค์ ๋ชจ๋ extern ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํจ, extren ํค์๋๊ฐ ์๋ ์ ์ธ๋ง์ด ๊ฐ ์ด๊ธฐํ ๊ฐ๋ฅ)
extern ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ํดํธ๋ก ๋์ด์๋ ๋ด๋ถ ๋งํฌ๋ฅผ ๊ฐ์ง ์ ์๋ค.
extern const states=50;//์ธ๋ถ ๋งํฌ
์ด ์์๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ์ผ์์ extern ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํด์ผ ํจ.
ํจ์์ ๋งํฌ
๋ชจ๋ ํจ์๋ ์ ์ ๊ธฐ์ต ์กด์ ์๊ฐ์ ๊ฐ์ง๋ค.
ํจ์๋ ์ธ๋ถ ๋งํฌ๋ฅผ ๊ฐ์ง๋ค. (์ฌ๋ฌ ํ์ผ์ด ํจ์๋ฅผ ๊ณต์ ๊ฐ๋ฅ)
ํจ์ ์ํ์ extern์ ์ ์ฉํ์ฌ ๊ทธ ํจ์๊ฐ ๋ค๋ฅธ ํ์ผ์ ์ ์๋์ด ์๋ค๋ ๊ฒ์ ๋ํ๋ผ ์ ์์ง๋ง ์ ํ์ ์
static ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ๋ด๋ถ ๋งํฌ ๋ถ์ฌ ๊ฐ๋ฅ
ํจ์์ ์ฌ์ฉ๋ฒ์๋ฅผ ํ๋์ ํ์ผ๋ก ์ ํ.
static int private(double x);
...
static int private(double x);
{
...
}
๊ธฐ์ต ๊ณต๊ฐ ํ์๊ณผ ๋์ ๋์
๋์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉ ๋ฒ์๋ ๋งํฌ ๊ท์น์ ์ํด์๊ฐ ์๋, new์ delete ์ฐ์ฐ์์ ์ํด ๋ค๋ฃจ์ด์ง๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋์ ํจ์๋ก๋ถํฐ ๋์ ๋ฐ๊ณ , ๋ค๋ฅธ ํจ์์์ ํด์ ๊ฐ๋ฅ.
๊ธฐ์ต ๊ณต๊ฐ ํ์์ด๋ผ๋ ๊ฐ๋ ์ด ๋์ ๋ฉ๋ชจ๋ฆฌ์๋ ์ ์ฉ๋์ง ์์ง๋ง, ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์๋ ๋ฐ ์ ์ ํฌ์ธํฐ ๋ณ์์๋ ์ ์ฉ๋๋ค.
ex)
float * p_fees = new float[20];
๋ฉ๋ชจ๋ฆฌ๊ฐ new์ ์ํด์ ๋์ ๋๊ณ , delete์ ์ํด ํด์ ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค. ๊ทธ๋ฌ๋ p_fees ํฌ์ธํฐ๋ ์ด ๋ณ์๊ฐ ์ ์ธ๋์ด ์๋ ํจ์๊ฐ ์ข ๋ฃ๋ ๋ ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋์ ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํจ์์๋ ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด, ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ํจ์์ ์ ๋ฌํ๊ฑฐ๋ ๋ฆฌํดํด์ผ ํจ.
p_fees๋ฅผ ์ธ๋ถ ๋งํฌ๋ฅผ ๊ฐ๋๋ก ์ ์ธํ๋ฉด, ํ์ผ์์ ๊ทธ ์ ์ธ์ ๋ค์ ์ค๋ ํจ์์์ p_fees ํฌ์ธํฐ ์ฌ์ฉ ๊ฐ๋ฅ.
extern float *p_fees;