본문 바로가기
C++/기초(두들낙서)

[C++기초] 네임스페이스

by Meaning_ 2022. 1. 12.
728x90
반응형

네임스페이스

 

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 google {
    void set() {
        n = 30;
    }
}

이렇게 namespace 다시 구현해준 후 set함수를 만들어주는 방법도 있는 반면 

 
void google::set() {
    n =30;
}

 

어차피 앞에 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 {

        
        void set() {
            n = 30;
        }
 
        int n;
    }
 
google네임스페이스에서 n의 위치를 바꿔봤다. n을 선언하는 것을 뒤에 하면 보통 c언어에서는 에러가 뜨는데
이상하게 에러가 뜨지 않았고 빌드를 하니 10 30 0 으로 출력됐다.

 

google::set() 안의 n을 컴파일러가 만났을 때 n이 어디있는지 찾는다 

위로 올라가서 보니 doodle 네임스페이스에 n이 있는 것을 보고 이 n을 30으로 바꿔준다.

 

그래서 ::n은 그대로 10

doodle::n은 30

google::n은 0 이 나오게 되는 것이다.

728x90
반응형

댓글