OneDev

[C++] 이름공간(namespace) 본문

Language/C++

[C++] 이름공간(namespace)

one_dev 2022. 7. 4. 17:25

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
Comments