네임스페이스
1
2
3
4
5
6
7
8
9
10
|
#include <iostream>
using namespace std;
int n;
void set() {
::n = 10; // 명시적 전역변수
//aaa::n --> aaa라는 네임스페이스에 속해있는 n
}
|
cs |
::n=10;은 명시적 전역변수를 의미한다
예를 들어 aaa::n이면 aaa라는 네임스페이스 속해있는 n이다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
using namespace std;
int n;
void set() {
::n = 10; // 명시적 전역변수
//aaa::n --> aaa라는 네임스페이스에 속해있는 n
}
namespace doodle {
int n;
void set() {
doodle::n = 20;
}
}
namespace google {
int n;
void set() {
google::n = 30;
}
}
int main() {
::set();//전역의 set호출
doodle::set();
google::set();
cout << ::n << endl;
cout << doodle::n << endl;
cout << google::n << endl;
}
|
cs |
이 코드에서는 n이 3개나 있다. 하지만 전역,doodle네임스페이스,google네임스페이스 로 변수가 속한 네임스페이스가 다르기때문에 사실상 다른 n이다 (동명이인임..ㅋ)
예를 들어 이렇게 자신이 속한 네임스페이스를 명시해주지 않은 경우 (google::n 이라고 명시해주지 않음) 자신이 속한 네임스페이스 안에 변수로 자동으로 인식한다.
만약 google에 속한 n을 ::n으로 바꿔서 전역변수에 속한 n으로 선언해주면 출력값은 어떻게 될까?
출력값은
30
20
0
이 되는데
::n=30을 하면 맨 위에 int n이 30이라는 것을 의미한다.
::n을 하면 전역변수에 있는 n이 10인데, 우리가 ::n=30이라 하면서 전역변수에 있는 int n을 30으로 바꿨기 때문에
30이된다
doodle::n을 하면 그대로 20
google::n 을 하면 google 네임스페이스에서는 int n; 이라고만 해줬기 때문에 그냥 0 이된다.
google::n에 대해 딱히 선언해준게 없기 때문이다.
앞에 배웠던 프로토타입과 네임스페이스를 결합해보자. (위에서 구현만 해놓고, 선언은 아래에!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
using namespace std;
int n;
void set() {
}
namespace doodle {
int n;
void set();
}
namespace google {
int n;
void set();
}
int main() {
::set();
doodle::set();
google::set();
cout << ::n << endl;
cout << doodle::n << endl;
cout << google::n << endl;
}
namespace doodle {
void set() {
n = 20;
}
}
namespace google {
void set() {
n = 30;
}
}
void google::set() {
n =30;
} |
cs |
독특한 부분이 33번째줄부터 41번째 줄인데
이렇게 namespace 다시 구현해준 후 set함수를 만들어주는 방법도 있는 반면
}
어차피 앞에 namespace 구현해놨으니까 google::set()으로 set함수 만들어주는 방법도 있다.
네임스페이스 중첩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <iostream>
using namespace std;
int n;
void set() {
n = 10;
}
namespace doodle {
int n;
void set() {
n = 20;
}
namespace google {
int n;
void set() {
n = 30;
}
}
}
int main() {
::set();
doodle::set();
doodle::google::set();
cout << ::n << endl;
cout << doodle::n << endl;
cout << doodle::google::n << endl;
}
|
cs |
중첩되면 doodle::google::set(); 이런식으로 써주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <iostream>
using namespace std;
int n;
void set() {
n = 10;
}
namespace doodle {
int n;
void set() {
n = 20;
}
namespace google {
void set() {
n = 30;
}
int n;
}
}
int main() {
::set();
doodle::set();
doodle::google::set();
cout << ::n << endl;
cout << doodle::n << endl;
cout << doodle::google::n << endl;
}
|
cs |
namespace google {
google::set() 안의 n을 컴파일러가 만났을 때 n이 어디있는지 찾는다
위로 올라가서 보니 doodle 네임스페이스에 n이 있는 것을 보고 이 n을 30으로 바꿔준다.
그래서 ::n은 그대로 10
doodle::n은 30
google::n은 0 이 나오게 되는 것이다.
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++기초] this 포인터 ,객체의 생성과 소멸,생성자와 소멸자 (0) | 2022.01.12 |
---|---|
[C++기초] 클래스 개념소개,접근제어 지시자,구조체와 클래스의 차이점 (0) | 2022.01.12 |
[C++기초]이차원 배열을 범위기반 for문으로 구현하기 (0) | 2022.01.12 |
[C++기초] 오버로딩,디폴트 매개변수 (0) | 2022.01.12 |
[C++기초] 레퍼런스 변수 (0) | 2022.01.11 |
댓글