I'm FanJae.

[C++] namespace 정리 본문

C++/Basic

[C++] namespace 정리

FanJae 2024. 8. 5. 23:08

※ 본 포스트는 코드누리 C++ Basic 강의 내용을 보고 정리한 포스트입니다.

 

1. namespace 란?

C 언어에서는 동일한 이름의 함수를 2개 이상 만들 수 없다.

 

이와 달리 C++ 에서는 "namespace"라는 문법을 사용하면, 관련된 코드 (함수, 구조체, 전역 변수 등)을 묶어서 관리 할 수 있다.

 

서로 다른 이름 공간에서는 동일한 이름을 사용할 수 있다.

#include <stdio.h>

namespace Audio
{
	void init() { printf("init Audio module\n"); }
	void reset() { printf("reset Audio module\n"); }
}
namespace Video
{
	void init()
	{
		printf("init Video module\n");
	}
}
int main()
{
//	init(); // error
	Audio::init();
	Video::init();
}

 

이처럼, namespace를 사용하면 서로 다른 이름 공간 안에서 

 

1-1. namespace 요소에 접근하는 방법 3가지

 

① Qualified name(완전한 이름) 사용 - 권장

Audio::init();

 

② using declaration(선언) 사용

using Audio::init() // init 함수를 namespace 이름인 Audio:: 없이 사용 가능

init(); // 정상 작동

reset(); // 에러

 

③ using directive(지시어)를 사용

using namespace Audio;

init()

reset();


2. global namespace

특정한 이름공간에 포함 되지 않은 공간

 

#include <stdio.h>

namespace Audio
{
	void init() { printf("init Audio module\n"); }
	void reset() { printf("reset Audio module\n"); }
}
namespace Video
{
	void init()
	{
		printf("init Video module\n");
	}
}

void init() { printf("init global module\n"); }

int main()
{
	Audio::init();
	Video::init();
    
	::init(); // global 모듈을 찾음.
}

 

2-1. init() vs ::init()의 차이

init() 1. 열려 있는 namespace 검색
2. global namespace 검색
::init() 1. global namespace 검색
2. global init()이 없는 경우 에러

 

2-2. using declaration을 함수 밖에서 사용한 경우

using 선언 아래에 있는 모든 함수에서 Audio:: 이름 없이 접근이 가능

global namespace 에 동일 이름의 함수가 있을 경우 compile error

global namespace 에 동일 이름의 함수가 없을 경우, init(), ::init() 모두 Audio::init() 호출

 

2-3. 결론

가급적 global namespace를 피하고, Qualified name을 사용하는 것이 더 안전하고, 코드를 유지보수하기에 용이하다.


3. namespace 사용시 파일 분할 방법

// Video1.h
namespace Video
{
	void init();
}

// Video1.cpp
#include "Video1.h"

// 방법 1. 주로 많이 사용됨
namespace Video
{
     void init()
     {
     
     }
}

 

// Video2.h
namespace Video
{
	void reset();
}

// Video2.cpp
#include "Video2.h"

// 방법 2.
void Video::reset()
{

}

 

3-1. 첫번째 방법이 많이 사용되는 이유

 

함수 정의가 네임 스페이스 블록 내에 직접 포함되어 있어, 해당 함수가 어느 네임 스페이스에 속해있는지 쉽게 파악이 가능하다. 이것은 코드가 길거나 파일이 많아져도, 함수 네임 스페이스 간의 관계를 명확히 알 수 있어 유용하다.

또, 함수 정의와 네임 스페이스를 하나의 블록에 집중 시켜서 네임 스페이스 내에 있는 모든 기능을 한 눈에 파악이 가능

 

 

'C++ > Basic' 카테고리의 다른 글

[C++] Function II  (0) 2024.08.08
[C++] Function I  (0) 2024.08.07
[C++] C++ 에서 새롭게 추가된 Type & Variable  (0) 2024.08.06
[C++] 표준 입출력 정리  (0) 2024.08.06
[C++] Visual Studio C++ 언어 표준 설정.  (0) 2024.08.05
Comments