안녕하세요. 명월입니다.
이 글은 C++에서 사용되는 namespace와 using 사용법에 대한 글입니다.
이전에 제가 C++에서 함수 사용법과 클래스에 대해서 설명했습니다.
링크 - [C++] 함수 사용법(가변 파라미터 stdarg.h, 함수 포인터 그리고 범용 포인터 void*)
링크 - [C++] 클리스 선언과 사용법
C++에서는 Java와 C#과 다르게 가장 최소 단위가 함수 단위입니다. 그 뜻은 class가 없어도 main 함수만 있어도 실행이 됩니다.
거기에서 클래스를 확장하고.. 더욱 큰 함수면 라이브러리나 프로젝트를 달리해서 참조 형식으로 사용할 수 있습니다.
그러나 이 함수나 클래스만으로도 유니크 명명이 한계가 있습니다.
예를 들면, 한개의 프로젝트에 두개의 데이터 베이스를 접속한다고 할 떄, oracle과 mssql를 접속하는 라이브러리를 사용한다고 하면 아마 한두개 정도는 class명이 겹치는 경우가 발생할 것입니다.
그래서 이런 것을 해결하기 위해서는 namespace가 있습니다. 이 namespace는 Java의 package와 C#의 namespace와 같은 개념입니다.
#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - A : " << " Test::print() " << endl;
}
};
}
// namespace B 구역을 선언
namespace B
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - B : " << " Test::print() " << endl;
}
};
}
// 실행 함수
int main()
{
// A namespace의 Test 클래스를 할당.
A::Test test1;
// A namespace의 Test클래스의 print() 함수를 호출
test1.print();
// B namespace의 Test 클래스를 할당.
B::Test test2;
// B namespace의 Test클래스의 print() 함수를 호출
test2.print();
return 0;
}
Test 이름의 클래스가 두개 작성이 가능합니다. 차이는 namespace로 구분이 다릅니다.
사용할 떄는 클래스 앞에 namespace명으로 구분해서 Test 클래스를 구분합니다.
using은 namespace를 전역으로 선언이 가능합니다.
Java에서 import와 C#의 using과 같습니다. 차이는 C++에는 include가 존재합니다.
include는 파일을 포함시키는 전처리문이고 using은 namespace의 영역의 객체를 명시하지 않아도 사용할 수 있게 하는 키워드입니다.
#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - A : " << " Test::print() " << endl;
}
};
}
// namespace B 구역을 선언
namespace B
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - B : " << " Test::print() " << endl;
}
};
}
// B namespace의 객체는 따로 명시하지 않아도 사용 가능하다.
using namespace B;
// 실행 함수
int main()
{
// Test 클래스는 A namespace와 B namespace가 있습니다.
// using으로 B namespace를 선언했기 때문에 클래스는 B namespace를 가르킵니다.
Test test;
// B namespace의 Test클래스의 print() 함수를 호출
test.print();
return 0;
}
Test클래스를 할당할 때 따로 namespace를 선언하지 않아도 namespace B의 Test클래스가 선언되었습니다.
그건 using으로 namespace를 객체 명시를 하지 않아도 사용할 수 있게 설정했기 때문입니다. 여기서 namespace A의 Test를 사용하려면 A::Test이렇게 명시하면 됩니다.
참고로 여기서 using namespace A로 추가를 하게 되면 Test 클래스가 모호해지기 떄문에 에러가 발생합니다.
C++에는 다른 언어에는 없는 예약어 키워드를 만들 수 있는 typedef 키워드가 있습니다. typedef에 대해서는 operator와 같이 설명하겠습니다.
즉, using namespace를 사용하지 않고 typedef로도 namespace를 설정할 수 있습니다.
#include <stdio.h>
#include <iostream>
using namespace std;
// namespace A 구역을 선언
namespace A
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - A : " << " Test::print() " << endl;
}
};
}
// namespace B 구역을 선언
namespace B
{
// Test 클래스 선언
class Test
{
// 접근 제한자 설정
public:
// 함수 설정
void print()
{
// 콘솔 출력
cout << " namespace - B : " << " Test::print() " << endl;
}
};
}
// A::Test를 Test로 예약어를 바꾼다.
typedef A::Test Test;
// 실행 함수
int main()
{
// 이건 예약어를 설정했기 때문에 Test = A::Test이다.
Test test;
// A namespace의 Test클래스의 print() 함수를 호출
test.print();
return 0;
}
참고로 typedef로도 namespace를 사용할 수 있다는 것을 설명했습니다.
여기까지 C++에서 사용되는 namespace와 using 사용법에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Study > C , C++ , MFC' 카테고리의 다른 글
[C++] IO (fstream)(파일 읽기 쓰기)를 사용하는 방법 (0) | 2020.04.06 |
---|---|
[C++] 예외처리(try ~ catch, throw) 사용법 (2) | 2020.04.04 |
[C++] 리터럴 문자열(const char*, const wchar_t*)과 typedef, operator의 사용법 (0) | 2020.04.02 |
[C++] 람다식(functional) 사용법과 클로저(closure) 그리고 auto 자료형 (0) | 2020.03.22 |
[C++] 접근 제한자, 추상 클래스(순수 가상 메서드), 오버로드(Overloading)와 오버라이딩(Overriding) (0) | 2020.03.20 |
[C++] 클래스 상속 (0) | 2020.03.19 |
[C++] 템플렛(Template) (2) | 2020.03.19 |
[C++] 전처리문 (0) | 2020.03.17 |