namespaces

😎·2022년 11월 23일
0

CPP

목록 보기
1/46

네임 스페이스?

프로그램이 복잡해지고 여러 라이브러리가 포함될수록 변수, 함수, 구조체, 클래스 등이 같은 이름으로 서로 충돌할 가능성이 커진다.

이러한 이름 충돌 문제를 C++에서는 네임스페이스(namespace)를 통해 해결하고 있다.


C++에서는 namespace 키워드를 사용하여 사용자가 새로운 네임스페이스를 정의할 수 있다.

네임 스페이스에 접근?

네임스페이스를 정의한 후에는 해당 네임스페이스로 접근할 수 있는 방법이 필요하다.

네임스페이스에 접근하기 위해서는 범위 지정 연산자(::, scope resolution operator)를 사용하여, 해당 이름을 특정 네임스페이스로 제한하면 된다.


코드

1번은 전역으로 변수와 함수를 선언했다. 이제 같은 변수와 함수를 가진 네임스페이스를 만들어 볼 것이다.

2번은 Foo, 3번은 Bar 라는 namespaces에 전역과 같은 변수와 함수 이름에 다른 값을 넣었다.

4번은 Muf 라는 namespace 로 만들어서 Bar 를 대입했다.

#include <stdio.h>

// 1.
int gl_var = 1;
int f(void) { return 2; }

// 2.
namespace Foo {
    int gl_var = 3;
    int f(void) { return 4; }
}

// 3.
namespace Bar {
    int gl_var = 3;
    int f(void) { return 4; }
}

// 4.
namespace Muf = Bar;

int main(void) {
    printf( "gl_var:        [%d]\n", gl_var);
    printf( "   f():        [%d]\n\n", f());

    printf( "Foo::gl_var:   [%d]\n", Foo::gl_var);
    printf( "Foo::f():      [%d]\n\n", Foo::f());

    printf( "Bar::gl_var:   [%d]\n", Bar::gl_var);
    printf( "Bar::f():      [%d]\n\n", Bar::f());

    printf( "Muf::gl_var:   [%d]\n", Muf::gl_var);
    printf( "Muf::f():      [%d]\n\n", Muf::f());

// 5.
    printf( "::gl_var:      [%d]\n", ::gl_var);
    printf( "::f():         [%d]\n\n", ::f());

    return (0);
}

출력 결과를 확인해보자.

  • 5번처럼 namespace 없이 범위 지정 연산자(::) 만 하게 되면 전역으로 선언한 것과 같다.
  • 2번과 3번은 nameplace 에 따라 잘나눠져서 출력된다.
  • 4번은 namespace 선언 후 변수, 함수를 선언하지 않았다. 하지만 다른 namespace를 대입하여, 4번과 3번을 갖게 만들었다.

내가 이해한 방식

아파트마다 동 및 호수는 숫자로 나타낸다.

a는 101동 101호에 살아
b는 101동 101호에 살아

a와 b 가 같은 곳에 사는 걸로 헷갈릴 수 있다.

a는 "일산" 아파트 101동 101호에 살아
b는 "천안" 아파트 101동 101호에 살아

a와 b가 어디에 사는지 명확히 알 수 있다.
코드로 만들어보면 다음과 같을 것이다.

a = 일산::101101호
b = 천안::101101
profile
jaekim

0개의 댓글