001: #include <iostream>
002: using namespace std;
003:
004: //namespace 총정리 9~10 page
005: //1. 개념 :프로그램의 구성요소를 관련있는 것끼리 논리적으로 묶을때 사용
006: //이름충돌 자연히 해결
007:
008:
009: //2. 접근 방법
010: namespace Graphics
011: {
012: void Init(){}
013: void Draw(){}
014: void Reset(){}
015: }
016:
017: namespace Sound
018: {
019: void Init(){}
020: }
021:
022: int main()
023: {
024: //namespace 에 있는 함수를 사용 하는 3가지 방법
025: Sound::Init(); //1. 완전한 이름을 사용한 접근
026:
027: using Sound::Init; //2. using 선언
028: Init();
029:
030: using namespace sound; //3. using 지시어(Directive)
031: Init();
032: }
033:
034:
035: //3. 선언과 구현의 분리
036: //namespace는 접근 지정자를 사용하지 않는 class 이다.
037: namespace Sound
038: {
039: void Init();
040: }
041:
042: void Sound::Init()
043: {
044: }
045:
046:
047: //4. 인자 기반 탐색(퀴니그의 lookup) ★ - 가장 중요!!
048: namespace Sound
049: {
050: struct Card
051: {
052: };
053:
054: void Init(Card c)
055: {
056: }
057: }
058:
059: int main()
060: {
061: Sound::Card c;
062: Init(c); //인자가 있다면 그 인자가 속해 있는 namespace를 찾는다.
063: //함수 앞에 namespace를 붙이지 않아도 컴파일러가 호출해준다.
064: //퀴니그의 lookup
065:
066: std::cout << "hello" //cout은 std에 있다.
067: //<< 도 std에 있다.
068:
069: std::operator <<(std::cout, "hello");
070: }
071:
072:
073: //5. namespace는 열려 있다.
074: namespace A
075: {
076: void foo() {}
077:
078: }
079:
080: //다른 파일에서
081: namespace A //이름 충돌이 아니라 A에 추가 된다.
082: {
083: void goo() {}
084: }
085:
086:
087: //6. namespace의 별칭
088: namespace math_library
089: {
090: int plus(int a, int b) {}
091: int minus(int a, int b) {}
092: }
093:
094: namespace math_library2
095: {
096: int plus(int a, int b) {}
097: int minus(int a, int b) {}
098: }
099:
100: int main()
101: {
102:
103: //너무 길다
104: int s = math_library::plus(1, 2);
105:
106: //별명을 붙여 서 짧게 사용할 수 있으며 일일이 모든 코드의 변경 없이
107: //library를 선택적으로 쓸 수 있다.
108: //이유 : 별명만 바꾸어 주면 되니까..
109: namespace math = math_library; //namespace 별명
110: int s = math::plus(1, 2);
111: }
112:
113:
114: //7. 이름 없는 이름 공간
115: namespace //c의 static 함수 의미
116: {
117: void foo() {}
118: }
119:
120: //즉, 동일 파일에서만 접근할 수 있다. interal linkage <-> external linkage
121: static void goo();
122:
123: int main()
124: {
125: foo();
126: }
127:
128: //8. std에 대한 이야기
129: namespace std
130: {
131: //cout, endl 등등이 모두 이안에 있다.
132: }
133:
134: int main()
135: {
136: std::cout << "aa" << std::endl;
137: }
138:
139: //주의 사항
140: //만약 a.h 에서 cout이 필요 하다면 절대 using 사용 금지
141: //직접 std::cout 등과 같이 써야 함.
142:
143: //c++의 스타일의 헤더
144: #include <stdio.h> //c 표준 헤더. printf가 전역에 있다.
145: #include <cstdio> //c++ 스타일의 헤더. printf가 std 이름공간 안에 있다.
146: //c++의 철학..은 절대로 전역 공간을 사용하지 말고 특정 이름공간을 사용하게 된다.
147:
148: //cstdio의 원리
149: namespace std
150: {
151: #include <stdio.h>
152: }