안녕하십니까. 김동우입니다.
이번 노트에서는 간단히 지난 시간들의 복습과 변수의 범위에 대해 적어보려 합니다.
그럼 코드부터 보여드리겠습니다.
#include <iostream>
using namespace std;
// int a = 1;
// int a = 1;
// 위와 같은 정의는 충돌을 야기한다.
// 메모리를 차지하는 정의는 해당 영역에 오직 하나만 존재해야 한다.
namespace work1 // block 구분에 필수선언
{
int a = 1;
void doSomething()
{
a += 3;
}
}
namespace work2
{
int a = 1;
void doSomething()
{
a += 5;
}
}
namespace work3
{
namespace work33
{
namespace work333
{
int a = 1;
void doSomething()
{
a += 7;
}
}
}
}
// Cpp 17 이전의 문법
namespace work4::work44::work444
{
int a = 1;
void doSomething()
{
a += 7;
}
}
// Cpp 17 버전 이후의 최신문법
int main()
{
int apple(0); // define & initialize
apple = 5; // define했기에 assign이 가능하다.
cout << apple << endl; // output : 5
// nested block
{
apple = 4; // 위 apple과 같은 apple이다.
cout << apple << endl; // output : 4
}
{
int apple(10); // 동명의 변수지만, 위 apple과는 아예 다르다.
// 이에 변수명을 다르게 작명하는 것을 요구한다.
cout << apple << endl; // output : 10
}
// 현대 프로그래밍에서는 변수의 소멸을 신경쓰기 때문에, 사용하는 곳 인근에서만
// 살아남을 수 있도록 코딩을 해야 한다.
cout << apple << endl; // output : 4
work1::a;
work1::doSomething();
work2::a;
work2::doSomething();
cout << work1::a << " " << work2::a << endl;
// output : 4 6 warning 발생
work3::work33::work333::doSomething();
work4::work44::work444::doSomething();
// 사용은 이런 방식으로 하면 된다.
// 그러나 depth가 너무 높은 방식의 namespace 정의는 효율이 떨어질 수 있다.
return 0;
}
// apple = 3;
// 위와 같은 assign은 scope를 벗어났기에 불가능하다. -> 메모리가 이미 반납되었다.
그럼 이번 글은 이만 마치도록 하겠습니다. 감사합니다.