OneDev
[C++] 이름공간(namespace) 본문
1. 이름공간(namespace)이란?
이름공간(namespace) 란 어떤 정의된 객체에 대해 어디에 소속되어있는지 지정해 주는 것이다.
코드의 길이가 늘어남에 따라 중복된 이름을 가진 함수들이 늘어났고, C++에서는 이들을 구분하기 위해 이름이 같더라도 소속된 이름공간(namespace)가 다르다면 다른 함수인 것으로 취급하게 되었다.
예를 들자면 영국에 사는 찰스와 미국에 다른 찰스가 서로 다른 느낌이다.
아래의 예를 보자.
std::cout;
위의 코드는 std 라는 namespace 에 저장되어 있는 cout 을 의미한다.
만약 std 없이 그냥 cout 만 적게된다면 컴파일러는 cout을 찾지못한다. 어디에 소속된 cout인지 알 길이 없기 때문이다.
2. namespace를 정의하는 방법
namespace를 정의하는 방법은 아래와 같다.
// header1.h 의 내용
namespace 이름공간1{
int abc();
}
위 코드에서 abc는 이름공간1 이라는 namespace에 살고 있는 abc가 되는 것이다.
+ 자신이 포함된 이름공간 안에서는 앞에 이름공간을 명시하지 않고도 사용이 가능하다.
#include header1.h
namespace header1{
int func()
{
abc(); // 알아서 header1::abc 가 실행된다
header2::efg() // 반면 어떠한 이름공간에도 소속되지 않았다면 명시적으로 이름공간 지정해줘야 한다
}
}
++ 반복적으로 특정한 함수를 사용해야 할 경우 다음과 같이 특정 이름공간의 특정 함수만 사용할 수 있도록 선언할 수도 있다.
#include header1.h
using header1::abc; // header1 이란 namespace 에 있는 foo 만 쓸것이다!
int main(){
abc(); // header1 이름공간에 있는 abc를 호출
}
+++ 어떠한 이름 공간에도 소속되지 않은 경우라면 명시적으로 이름 공간을 지정해야 한다
#include "header1.h"
#include "header2.h"
int func()
{
header1::foo(); // header1 이란 이름 공간에 있는 foo 를 호출
}
3. using namespace : 사용할 이름공간 선언하기
특정한 이름공간 안의 정의된 모든 것들을 namespace:: 없이 사용하고자 할때 using namespace를 사용할 수 있다.
using namespace std; // std 라는 이름공간을 사용하겠다 선언
이에 대해 알아보기 위해 cpp 를 이용해 Hello world 라는 문구를 출력하는 프로그램을 만드는 과정을 생각해보자.
아래와 같은 코드를 실행하면 Hello World 라는 문구가 출력되는 것을 확인할 수 있다.
#include <iostream>
int main(){
std::cout << "Hello World" << std::endl;
return 0;
}
여기서 각각의 단어(?) 들이 무엇을 의미하는지는 나중에 알아보기로 하자.
중요한 것은, using namespace std; 라고 적어줌으로써 std 이름공간 안에 정의된 모든 클래스, 함수, 변수 등을 접두어 없이 사용가능하게 되었다는 점이다.
(참고 : 헤더의 iostream은 cpp에서 출력을 위해 제공되는 표준 라이브러리이고 cout 과 endl 은 모두 std라는 이름공간에 정의되어 있는 것들이다)
위의 코드는 아래와 같이 쓸 수 도 있다.
#include <iostream>
using namsepace std;
int main(){
cout << "Hello World" << endl;
return 0;
}
처음 작성했던 코드와 비교해보자.
using namespace std; 라는 코드를 적어주었더니
std::cout 대신 cout 만 써줘도 정상적으로 실행하는 것을 확인할 수 있다.
using namespace를 이용해 어떠한 이름공간을 사용할 지 선언하면 편리하기는 하나, 오류가 발생할 위험이 생긴다
(이름이 겹치는 함수를 만들게 되면).
게다가 C++ 의 표준 라이브러리는 매우 거대해서, 굉장히 많은 종류의 함수들이 존재하고 있다.
잘못하다 이름을 겹치게 사용하게 된다면, 바로 잡는데 상당한 시간이 소요될 수 있다.
이에 using namespac를 이용해 이름공간을 선언한 후 사용하는 것 보다는 std:: 와 같이 이름공간을 직접 명시해 주는 방법이 권장된다.
4. 이름없는 이름공간?
사실 C++ 에서는 이름공간의 이름을 굳이 설정하지 않아도 된다.
이런 경우에 해당 공간에 정의된 것들은 해당 파일 안에서만 접근이 가능하다.
(마치 static 키워드를 사용한 것과 같은 효과를 낸다)
#include <iostream>
namespace {
// 이 함수는 이 파일 안에서만 사용할 수 있다
int OnlyInThisFile() {}
}
int main() {
OnlyInThisFile();
}
'Language > C++' 카테고리의 다른 글
[C++] new 와 delete : 메모리 할당과 해제 (0) | 2022.08.09 |
---|---|
[C++] 참조자(레퍼런스) (0) | 2022.08.05 |
[C++] 자료형 개요(작성중) (0) | 2022.08.01 |
[C++] main 함수란? (0) | 2022.08.01 |
[C++] 변수 선언 (0) | 2022.07.04 |