본문 바로가기
c++

[C++] namespace 네임스페이스 개념 정리

by Hyper하이퍼 2023. 6. 5.
반응형

안녕하세요. 하이퍼(Hyper)입니다.

오늘은 C++에서 가장 흔히 사용하는 namespace(네임스페이스)에 대해 알아보려합니다.

오늘도 쉬운 예시와 함께 알아보겠습니다.

 

[목차]

1. namespace(네임스페이스)란? 무엇인가?

2. namespace(네임스페이스)의 요소에 접근하는 방법

 

 

1. namespace(네임스페이스)란? 무엇인가?


여러 개발자가 공동으로 하나의 프로젝트를 만드는 경우가 빈번합니다. 그 때 너도나도 간단하면서 한 눈에 알아 볼 수 있는 변수명을 사용하게 되는데, 그러다보니 변수명이 겹치는 아찔한 상황이 많이 발생 됩니다.

이 때 namespace(네임스페이스)를 알면 아찔한 상황?을 피할 수 있습니다.

 

예를들어 티비를 만드는 개발 부서에서 Sound를 담당한 A가 "init"이라는 초기화 함수를 만들었는데, Display를 담당한 B가 "init"이라는 초기화 함수를 또 만들면, 두 함수가 충돌 되어 알고리즘이 엉망이 됩니다..

 

정리하면 다음고 같습니다.

  • "namespace"를 사용하면 "함수, 구조체, 전역 변수 등을 묶어서 관리 할 수있다.
  • 서로 다른 namespace(네임스페이스)에서는 동일한 이름을 사용할 수 있다. 

 

이제 왜 namespace(네임스페이스)가 필요한지 알게 되셨을 것입니다.

 

아래과 같이 init 함수를 동시에 두개 만들 수 없습니다.

(main에서 init 함수 호출 시 에러가 발생하게 됩니다..)

반응형
#include <stdio.h>

void init()
{
    printf("init Sound\n");
}

void init()
{
    printf("init display\n");
}

int main()
{
    init(); // error
}

 

 

그럼 이제 namespace(네임스페이스)를 반영하여, init 함수를 양쪽에서 사용하는 코드를 보시겠습니다.

 

#include <stdio.h>

namespace Sound
{
    // Sound와 관련 된 구조체, 함수, 전역변수를
       여기에 만들어 관리한다.
    void init()
    {
        printf("init Sound\n");
    }
}

namespace Display
{
    // Display와 관련 된 구조체, 함수, 전역변수를
       여기에 만들어 관리한다.
    void init()
    {
        printf("init Display\n");
    }
}


int main()
{
    Sound::init(); // Sound의 init함수 호출
    Display::init(); // Display의 init함수 호출
}

 

 

2. namespace(네임스페이스)의 요소에 접근하는 방법


namespace(네임스페이스)의 요소에 접근하는 방법은 3가지가 있습니다.

  1. 완전한 이름 (Qualified name)을 사용하는 방식
  2. 선언(Using declaration)을 사용하는 방식
  3. 지시어(using directive) 를 사용하는 방식

 

각각 어떻게 사용하는지 보면 다음과 같습니다.

 

1. 완전한 이름(qualified name) 사용

Sound::init()
2. 선언(using declaration) 사용

using Sound::init()
3.지시어(using directive) 사용

using namespace Sound;
init();

 

 

이제 전체 코드를 보면서 main함수에서 어떻게 사용 되는지 알아보겠습니다.

 

#include <stdio.h>

namespace Sound
{
    void init()
    {
        printf("init Sound\n");
    }
}

namespace Display
{
    void init()
    {
        printf("init Display\n");
    }
    
    void reset()
    {
        printf("reset Display\n");
    }
}

int main()
{
    Sound::init(); // namespace Sound의 init을 완전한 이름 방식으로 호출
    
    using Display::init;
    init(); // init함수를 namespace 이름인 'Sound::'없이 사용
    
    using namespace Display;
    init();
    reset(); // Display안의 모든함수를 'Display::'없이 사용
    
}

 

namespace의 요소에 접근하는 3가지 방법을 알아 보았습니다.

귀찮긴 하더라도 이름 충돌을 방지 하기 위해 3가지 중 첫 번째 방식인 '완전한 이름(qualified name)'을 사용하길 권장합니다.

두 세 번째 방식은 규모가 커질 수록 이름이 충돌 날 가능성이 있기 때문입니다.

 

 

오늘은 namespace(네임스페이스)의 개념과 namespace에 정의 된 요소에 접근하는 방법에 대해서 알아보았습니다.

다음에는 global namespace에 대해 알아보고, 제가 왜 완전한 이름(qualified name)으로 요소를 호출하는 걸 추천하는지 그 이유에 대해서 설명드리겠습니다.

 

 

감사합니다.

하이퍼(Hyper)였습니다.

반응형