본문 바로가기
IT/C++(CPP)

CPP 초급 강좌 1. namespace 네임스페이스 개념, 사용법 / C++

by 신림83 2020. 9. 22.
반응형

CPP 초급 강좌 1. namespace 네임스페이스 개념, 사용방법 / C++

아래 내용은

연산자와 제어문, 함수, 배열과포인터, 구조체등의 계념을 이해하는 개발자를 위한 내용입니다.

 

namespace 란 무엇일까요? 왜 필요한 걸까요? 

 

그럼 먼저 아래 namespace 가 필요한 경우를 살펴봅시다.

 

예제 1

예제 1번과 같이 Screen, Audio, System을 초기화해주는 함수를 각각 만들려고 합니다. 

셋 모두를 init() 이라는 함수명으로 만들고 싶은데, 같은 함수명은 만들 수가 없죠. 함수 이름을 다른 이름으로 가야 할 듯한데, 이번 경우에는 namespace 한 것을 이용해서 회피해봅시다.

 

@ namespace 의 필요성

1. 프로그램은 소규모로 제작할 수도 있지만, 대규모 프로젝트들도 많습니다. 수많은 개발자가 같이 작업할 수 있는데, 이 경우 함수 및 구조체 등이 이름충돌 이 발생할 여지가 많습니다. 

 

2. namespace란 것을 활용하여 각 요소들을 모아서 관리할 수 있습니다. 이러면 각 namespace 간에 이름충돌 요소를 해결할 수 있습니다.

 

일단 예제 1번을 해결하면서, 추가 사용법을 보겠습니다.

 

예제 2.

예제 2번은 Screen, Audio 네임 스페이스를 생성하여 Main()함수에서 각각의 호출하게 하였습니다.

 

namespace 내부의 기능은 해당 네이스페이스이름::~~~~ 로 호출해주시면 됩니다. 55, 56번 라인

 

System init 과 같은 경우는 네임스페이스가 없습니다. 이와 같은 경우는 global namespace 라고 부릅니다.

 

해당 기능을 보시면 왜 사용하는지, 어디에 사용하면 좋을지 어느 정도 감이 오실 겁니다.

 

 

* namespace의 장점은?

 프로그램의 다양한 요소들 함수, 구조체 등을 연관된 요소끼리 묶어서 관리할 수 있다.

 기능별로 다른 이름 공간을 사용함으로써 각 요소들의 이름 충돌을 막을 수 있다.

 

@ namespace의 요소에 접근하는 방법

1. qualified name(한정된 이름)을 사용하는 방법

예제 3.

 namespace Screen에 접근하기 위하여 라인 11번과 같이 Screen::init(); 이라고 명식적으로 호출함

 

2. using 선언(declaration)을 사용하는 방법

에제 4.

 using 선언을 이용해서 접근할 수 있다. 예제 4번 11번 라인과 같이 using Audio::init; 라고 표기하면 해당 함수 내부 영역{ }에서 init();을 호출하면 해당 Screen 네임스페이스의 init();을 호출하게 된다.

 

해당 함수 호출을 자주 해야 한다면 고려할만하다.

 

3. using 지시어(directive)를 사용하는 방법

예제 5.

 11라인에 using namespace Screen; 와 같이 해당 함수에서 Screen 네임 스페이스의 모든 요소를 Screen:: 없이 사용할 수 있다. reset(); 또한 호출이 가능해진다.

 

 해당 함수에서 해당 namespace를 자주 사용한다면 고려할만하다.

 

 

* using 지시어의 위치

예제 5번과 같이 함수 내부가 아닌, 외부, 글로벌에 위치시킬 수도 있다. 

 

예제 6.

라인 9번과 같이 using 지시어를 위치시킬 수 있다. 같은 동작을 보장한다. 

 

다음과 같은 문제를 생각해볼 수 있다. global namespace 영역에 이미 init() 함수가 동작한다면

예제 7.

15번은 어떤 녀석을 명시적으로 호출해야되닌지 모호하여 애러를 발생시킨다. 

 

이럴 경우는 qualified name 방식으로 접근해야 한다. 글로벌 스페이스에 접근하는 방식은 아래를 보자.

예제 8.

15번 라인의 Screen::init(); //namespace Screen을 호출함

16번 라인의 ::init(); //global namespace 의 init()을 호출한다.

 

위와 같은 코딩을 할 수 있지만 지양하는 것이 좋을 거 같다.

 

정리하자면, qualified name 방식으로 접근하는 것이 좋다. 기본적으로는 이미 사용하고 있는 함수명을 피하는 것이 좋고,

 

@ 선언파일과 구현파일로 나눠 구현된 함수일 경우 namespace 적용

Screen.h 선언파일

예제 9.

Screen.cpp 구현파일

구현부에 namespace를 적용하는 2가지 방법

-1.

예제 10.

-2.

예제 11.

예제 10번과 같이 많이 쓴다. 예제 11번과 같이는 잘 사용하지 않는다. 이렇게도 되긴 된다는 걸 알려드림..

반응형

댓글