๋ณ์, ํจ์ ๋ฐ ๋ณตํฉ ์ ํ๊ณผ ๊ฐ์ ๋ช
๋ช
๋ ์ํฐํฐ๋ C++์์ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ์ธํด์ผ ํฉ๋๋ค. ์ด ์ ์ธ์ด ๋ฐ์ํ๋ ํ๋ก๊ทธ๋จ์ ์ง์ ์ ๊ฐ์์ฑ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ธ๋ก ์ธ๋ถ์ ์ ์ธ๋ ์ํฐํฐ๋ ์ ์ญ ๋ฒ์ ๋ฅผ ๊ฐ์ง๋ฉฐ , ์ด๋ ํด๋น ์ด๋ฆ์ด ์ฝ๋์ ์ด๋ ๊ณณ์์๋ ์ ํจํจ์ ์๋ฏธํฉ๋๋ค. ํจ์๋ ์ ํ๋ฌธ๊ณผ ๊ฐ์ด ๋ธ๋ก ๋ด์์ ์ ์ธ๋ ์ํฐํฐ๋ ๋ธ๋ก ๋ฒ์ ๋ฅผ ๊ฐ์ง๋ฉฐ ์ ์ธ๋ ํน์ ๋ธ๋ก ๋ด์์๋ง ๋ณผ ์ ์์ง๋ง ์ธ๋ถ์์๋ ๋ณผ ์ ์์ต๋๋ค.
๋ธ๋ก ๋ฒ์์ ๋ณ์๋ฅผ ์ง์ญ ๋ณ์ ๋ผ๊ณ ํฉ๋๋ค .
์๋ฅผ ๋ค์ด, ํจ์์ ๋ณธ๋ฌธ์ ์ ์ธ๋ ๋ณ์๋ ํจ์๊ฐ ๋๋ ๋๊น์ง ํ์ฅ ๋๋ ์ง์ญ ๋ณ์ ์
๋๋ค(์ฆ, ์ค๊ดํธ}ํจ์ ์ ์๋ฅผ ๋ซ๋๋ค), ๊ทธ๋ฌ๋ ์ธ๋ถ๋ ์๋๋ค:
int foo; // global variable
int some_function ()
{
int bar; // local variable
bar = 0;
}
int other_function ()
{
foo = 1; // ok: foo is a global variable
bar = 2; // wrong: bar is not visible from this function
}
๊ฐ ๋ฒ์์์ ์ด๋ฆ์ ํ๋์ ์ํฐํฐ๋ง ๋ํ๋ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ ๋ฒ์์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ๊ฐ์ ๋ณ์๊ฐ ์์ ์ ์์ต๋๋ค.
int some_function ()
{
int x;
x = 0;
double x; // wrong: name already used in this scope
x = 0.0;
}
๋ธ๋ก ๋ฒ์ ๊ฐ ์๋ ์ํฐํฐ์ ๊ฐ์์ฑ์ ๋ด๋ถ ๋ธ๋ก์ ํฌํจํ์ฌ ๋ธ๋ก ๋๊น์ง ํ์ฅ๋ฉ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ด๋ถ ๋ธ๋ก์ ๋ค๋ฅธ ๋ธ๋ก์ด๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ๋ฒ์์ ์๋ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ด๋ฆ์ ๋ด๋ถ ๋ธ๋ก ๋ด์์๋ง ๋ค๋ฅธ ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ์ฌ ์ธ๋ถ์ ์ด๋ฆ์ ์ง์ ํ๋ ์ํฐํฐ๋ฅผ ์จ๊น๋๋ค. ์ธ๋ถ์ ์๋ ๋์์๋ ์๋ ์ํฐํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
// inner block scopes
#include <iostream>
using namespace std;
int main () {
int x = 10;
int y = 20;
{
int x; // ok, inner scope.
x = 50; // sets value to inner x
y = 50; // sets value to (outer) y
cout << "inner block:\n";
cout << "x: " << x << '\n';
cout << "y: " << y << '\n';
}
cout << "outer block:\n";
cout << "x: " << x << '\n';
cout << "y: " << y << '\n';
return 0;
}
๋ด๋ถ ๋ธ๋ก์ ์จ๊ฒจ์ ธ y์์ง ์์ผ๋ฏ๋ก ์ก์ธ์ค y๋ ์ฌ์ ํ ์ธ๋ถ ๋ณ์์ ์ก์ธ์คํฉ๋๋ค.
๋ฃจํ ๋ฐ ์กฐ๊ฑด์์ ์ ์ธ๋ ๋ณ์ ๋ฐ ํจ์ ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ธ๋ก์ ๋์
ํ๋ ์ ์ธ์์ ์ ์ธ๋ ๋ณ์(์: for ๋๋ if์์ ์ ์ธ๋ ๋ณ์)๋ ํด๋น ๋ณ์๊ฐ ๋์
ํ๋ ๋ธ๋ก์ ๋ํด ๋ก์ปฌ์
๋๋ค.
๋ค์์คํ์ด์ค
ํน์ ๋ฒ์์์ ํน์ ์ด๋ฆ์ ๊ฐ์ง ์ํฐํฐ๋ ํ๋๋ง ์กด์ฌํ ์ ์์ต๋๋ค. ๋ธ๋ก์ ์๋์ ์ผ๋ก ์งง์ ๊ฒฝํฅ์ด ์๊ณ ์ด๋ฆ์๋ ์นด์ดํฐ ๋ณ์, ์ธ์ ๋ฑ์ ์ด๋ฆ ์ง์ ๊ณผ ๊ฐ์ ํน์ ๋ชฉ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ก์ปฌ ์ด๋ฆ์ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ก์ปฌ์ด ์๋ ์ด๋ฆ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. , ํนํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ ํจ์, ์ ํ ๋ฐ ๋ณ์๋ฅผ ์ ์ธํ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋ ๋ค ๋ณธ์ง์ ์ผ๋ก ์ง์ญ์ ์ด์ง ์๊ณ ์ผ๋ถ๋ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ ๋ฒ์
๋ฅผ ๊ฐ์ง ์ ์๋ ๋ช
๋ช
๋ ์ํฐํฐ ๋ฅผ ๋ ์ข์ ๋ฒ์๋ก ๊ทธ๋ฃนํํ์ฌ ๋ค์์คํ์ด์ค ๋ฒ์ ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค . ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ ์์๋ฅผ ์ด๋ฆ์ผ๋ก ์ฐธ์กฐ๋๋ ๋ค๋ฅธ ๋
ผ๋ฆฌ์ ๋ฒ์๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋ค์์คํ์ด์ค๋ฅผ ์ ์ธํ๋ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
namespace identifier
{
named_entities
}
์ฌ๊ธฐ์ identifier๋ ์ ํจํ ์๋ณ์์ด๊ณ named_entities๋ ๋ค์์คํ์ด์ค์ ํฌํจ๋ ๋ณ์, ์ ํ ๋ฐ ํจ์์ ์งํฉ์ ๋๋ค. ์๋ฅผ ๋ค์ด:
namespace myNamespace
{
int a, b;
}
์ด ๊ฒฝ์ฐ ๋ณ์ a๋ฐ b๋ ์ด๋ผ๋ ๋ค์์คํ์ด์ค ๋ด์์ ์ ์ธ๋ ์ผ๋ฐ ๋ณ์ myNamespace์
๋๋ค.
์ด๋ฌํ ๋ณ์๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ณ์( a๋๋ b)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์คํ์ด์ค ๋ด์์ ์ก์ธ์คํ ์ ์์ง๋ง ๋ค์์คํ์ด์ค ์ธ๋ถ์์ ์ก์ธ์คํ๋ myNamespace๊ฒฝ์ฐ ๋ฒ์ ์ฐ์ฐ์๋ก ์ ์ ํ๊ฒ ํ์ ํด์ผ ํฉ๋๋ค ::. ์๋ฅผ ๋ค์ด ์ธ๋ถ์์ ์ด์ ๋ณ์์ ์ก์ธ์คํ๋ ค๋ฉด ๋ค์ myNamespace๊ณผ ๊ฐ์ด ํ์ ํด์ผ ํฉ๋๋ค.
myNamespace::a
myNamespace::b
๋ค์์คํ์ด์ค๋ ์ด๋ฆ ์ถฉ๋์ ํผํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
// namespaces
#include <iostream>
using namespace std;
namespace foo
{
int value() { return 5; }
}
namespace bar
{
const double pi = 3.1416;
double value() { return 2*pi; }
}
int main () {
cout << foo::value() << '\n';
cout << bar::value() << '\n';
cout << bar::pi << '\n';
return 0;
}
์ด ๊ฒฝ์ฐ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ ๊ฐ์ ํจ์๊ฐ ์์ต๋๋ค: value. ํ๋๋ ๋ค์์คํ์ด์ค ๋ด์ ์ ์ foo๋๊ณ ๋ค๋ฅธ ํ๋๋ bar. ๋ค์์คํ์ด์ค ๋๋ถ์ ์ฌ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ํ pi๊ฐ ๋ค์์คํ์ด์ค ๋ด์์ ์ ๊ทํ๋์ง ์์ ๋ฐฉ์์ผ๋ก ์ก์ธ์ค๋๋ ๋ฐฉ์ bar( ์ฒ๋ผ pi)์ ์ฃผ๋ชฉํ์ธ์. ๋ฐ๋ฉด ์์ ๋ค์ ์ก์ธ์ค main๋์ง๋ง ์ฌ๊ธฐ์๋ ๋ก ํ์ ํด์ผ ํฉ๋๋ค bar::pi.
๋ค์์คํ์ด์ค ๋ถํ ๊ฐ๋ฅ: ์ฝ๋์ ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ๋์ผํ ๋ค์์คํ์ด์ค์์ ์ ์ธํ ์ ์์ต๋๋ค.
namespace foo { int a; }
namespace bar { int b; }
namespace foo { int c; }
์ด๊ฒ์ ์ธ ๊ฐ์ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค: aand is in cnamespace foo, while bis in namespace bar. ๋ค์์คํ์ด์ค๋ ์๋ก ๋ค๋ฅธ ๋ฒ์ญ ๋จ์(์ฆ, ์์ค ์ฝ๋์ ์๋ก ๋ค๋ฅธ ํ์ผ)๋ก ํ์ฅ๋ ์๋ ์์ต๋๋ค.
์ฌ์ฉ
ํค์๋ using๋ ํ์ฌ ์ ์ธ์ ์์ญ(์: ๋ธ๋ก)์ ์ด๋ฆ์ ๋์ ํ๋ฏ๋ก ์ด๋ฆ์ ํ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด:
// using
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using first::x;
using second::y;
cout << x << '\n';
cout << y << '\n';
cout << first::y << '\n';
cout << second::x << '\n';
return 0;
}
main์์ ๋ณ์ x(์ด๋ฆ ํ์ ์ ์์)๊ฐ ๋ฅผ ์ฐธ์กฐํ๋ first::x๋ฐ๋ฉด ์ ์ธ ์ ์ง์ ๋ ๋๋ก y๋ฅผ ์ฐธ์กฐ ํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ชฉ ํ์ญ์์ค. ๋ณ์ ๋ฐ ์ฌ์ ํ ์ก์ธ์คํ ์ ์์ง๋ง ์ ๊ทํ๋ ์ด๋ฆ์ด ํ์ํฉ๋๋ค. ํค์๋ ๋ ์ ์ฒด ๋ค์์คํ์ด์ค๋ฅผ ์๊ฐํ๋ ์ง์๋ฌธ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.second::yusingfirst::ysecond::x
// using
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main () {
using namespace first;
cout << x << '\n';
cout << y << '\n';
cout << second::x << '\n';
cout << second::y << '\n';
return 0;
}
์ด ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๊ฐ namespace ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ์ ์ธํจ์ผ๋ก์จ ์ด๋ฆ ํ์ ์๋ฅผ first์ง์ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ฉํ์ง ์๋ ๋ชจ๋ x๊ฒ๋ namespace ์์ ์กฐํ๋์์ต๋๋ค . ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ด ๊ธฐ์ ๋ ๋์ผํ ๋ธ๋ก์์๋ง ๋๋ ์ ์ญ ๋ฒ์์์ ์ง์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ์ ์ฒด ์์ค ์ฝ๋ ํ์ผ์์ ์ ํจ์ฑ์ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฝ๋๋ฅผ ๋ค๋ฅธ ๋ธ๋ก์ผ๋ก ๋ถํ ํ์ฌ ๋จผ์ ํ ๋ค์์คํ์ด์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋ค์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.yfirst
usingusing namespace
// using namespace example
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
}
namespace second
{
double x = 3.1416;
}
int main () {
{
using namespace first;
cout << x << '\n';
}
{
using namespace second;
cout << x << '\n';
}
return 0;
}
๋ค์์คํ์ด์ค ์จ๋ฆฌ์ด์ฑ
๊ธฐ์กด ๋ค์์คํ์ด์ค๋ ๋ค์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์ด๋ฆ์ผ๋ก ๋ณ์นญ์ ์ง์ ํ ์ ์์ต๋๋ค.
namespace new_name = current_name;
ํ์ค ๋ค์์คํ์ด์ค
ํ์ค C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ ์ํฐํฐ(๋ณ์, ์ ํ, ์์ ๋ฐ ํจ์)๋ std๋ค์์คํ์ด์ค ๋ด์์ ์ ์ธ๋ฉ๋๋ค. ์ค์ ๋ก ์ด ์์ต์์ ๋๋ถ๋ถ์ ์์๋ ๋ค์ ์ค์ด ํฌํจ๋์ด ์์ต๋๋ค.
using namespace std;
์ด๋ ๊ฒ ํ๋ฉด std๋ค์์คํ์ด์ค์ ๋ชจ๋ ์ด๋ฆ์ ์ฝ๋์ ์ง์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ดํด๋ฅผ ๋๊ณ ์์ ์ ๊ธธ์ด๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด ์์ต์์์ ์ํ๋์ง๋ง ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ ์์๋ฅผ ํ์ ํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์ ๋์ :
cout << "Hello world!";
๋์ ๋ค์์ ๋ณด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
std::cout << "Hello world!";
std๋ค์์คํ์ด์ค์ ์์๊ฐ ์ ์ธ๊ณผ ํจ๊ป ๋์ using๋๊ฑฐ๋ ์ฌ์ฉํ ๋๋ง๋ค ์์ ํ ์ ๊ทํ ๋๋์ง ์ฌ๋ถ๋ ๊ฒฐ๊ณผ ํ๋ก๊ทธ๋จ์ ๋์์ด๋ ํจ์จ์ฑ์ ์ด๋ค ์์ผ๋ก๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํผํฉํ๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ๋ช ์์ ์๊ฒฉ์ด ์ ํธ๋๋ ๊ฒฝํฅ์ด ์์ง๋ง ๋๋ถ๋ถ ์คํ์ผ ์ ํธ๋์ ๋ฌธ์ ์ ๋๋ค.
using namespace
์ ์ญ ๋๋ ๋ค์์คํ์ด์ค ๋ฒ์ ์ ๋ณ์์ ๋ํ ์ ์ฅ์ ๋ ํ๋ก๊ทธ๋จ์ ์ ์ฒด ๊ธฐ๊ฐ ๋์ ํ ๋น๋ฉ๋๋ค. ์ด๊ฒ์ ์ ์ ์ ์ฅ์ ๋ผ๊ณ ํ๋ฉฐ ์ง์ญ ๋ณ์ (๋ธ๋ก ๋ด์์ ์ ์ธ๋ ๋ณ์) ์ ๋ํ ์ ์ฅ์์ ๋์กฐ๋ฉ๋๋ค . ์ด๋ค์ ์๋ ์ ์ฅ์ด๋ผ๊ณ ํ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ง์ญ ๋ณ์์ ๋ํ ์ ์ฅ์๋ ํด๋น ๋ณ์๊ฐ ์ ์ธ๋ ๋ธ๋ก์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ํ ๋์ผํ ์ ์ฅ์๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ง์ญ ๋ณ์์ ์ฌ์ฉ๋๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ์ ์ฅ์ ๊ฐ ์๋ ๋ณ์์ ์๋ ์ ์ฅ์
๊ฐ ์๋ ๋ณ์ ์ฌ์ด์๋ ๋ ๋ค๋ฅธ ์ค์ง์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค . - ์ ์ ์ ์ฅ์ ๊ฐ ์๋ ๋ณ์
๋ช
์์ ์ผ๋ก ์ด๊ธฐํ๋์ง ์์ (์: ์ ์ญ ๋ณ์)๋ ์๋์ผ๋ก 0์ผ๋ก ์ด๊ธฐํ๋ฉ๋๋ค.
- ๋ช
์์ ์ผ๋ก ์ด๊ธฐํ๋์ง ์์ ์๋ ์ ์ฅ ๋ณ์ (์: ๋ก์ปฌ ๋ณ์)๋ ์ด๊ธฐํ๋์ง ์์ ์ํ๋ก ๋จ์ ์์ผ๋ฏ๋ก ๊ฐ์ด ๋ฏธ์ ์
๋๋ค.
// static vs automatic storage
#include <iostream>
using namespace std;
int x;
int main ()
{
int y;
cout << x << '\n';
cout << y << '\n';
return 0;
}
์ค์ ์ถ๋ ฅ์ ๋ค๋ฅผ ์ ์์ง๋ง ์ ๊ฐ๋ง x0์ผ๋ก ๋ณด์ฅ๋ฉ๋๋ค. y์ค์ ๋ก ๊ฑฐ์ ๋ชจ๋ ๊ฐ(0 ํฌํจ)์ ํฌํจํ ์ ์์ต๋๋ค.
'๐ Development Study > ๐จ๐พโ๐ป C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ตฌ์กฐ์ฒด (0) | 2022.08.19 |
---|---|
๋์ ๋ฉ๋ชจ๋ฆฌ (0) | 2022.08.19 |
ํฌ์ธํฐ (0) | 2022.08.19 |
๋ฌธ์์ด (0) | 2022.08.19 |
๋ฐฐ์ด (0) | 2022.08.19 |
๋๊ธ