컴공생의 다이어리
[c++] 이름 공간(namespace) 본문
cout을 사용할 때, 아래와 같이 std를 붙여서 코드를 작성한다.
std::cout<<"Hello World!"<<std::endl;
그렇다면 std는 무엇일까?
std는 C++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 이름 공간(namespace)이다.
이름 공간(namespace)이란?
이름 공간은 말 그대로 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것과 동일하다.
코드의 크기가 늘어남에 따라, 혹은 다른 사람들이 쓴 코드를 가져다 쓰는 경우가 많아지면서 중복된 이름을 가지는 함수들이 많아졌다. 따라서 C++에서는 이를 구분하기 위해, 같은 이름이라도, 소속된 이름 공간이 다르면 다른 것으로 취급했다.
앞서 "Hello Wolrd!"를 출력하기 위해 std::cout을 사용하는 이것은 std라는 이름 공간에 정의되어 있는 cout을 의미한다. 만약, std::없이 그냥 cout이라고 작성한다면 컴파일러가 cout을 찾지 못한다.
이름 공간을 정의하는 방법
이름 공간을 정의하는 방법을 설명하기 위해 두 헤더파일 header1.h와 header2.h가 있다고 하자.
//header1.h
namespace header1{
int foo();
void bar();
}
//header2.h
namespace header2{
int foo();
void bar();
}
위 코드에서 header1에 있는 foo는 header1라는 이름 공간에 살고 있는 foo가 되고, header2에 있는 foo의 경우 header2의 이름 공간에 살고 있다. 이름은 같지만 살고 있는 이름 공간이 다르다.
자기 자신이 포함되어 있는 이름 공간 안에는 굳이 앞에 이름 공간을 명시하지 않아도 된다. 예를 들어서
#include "header1.h"
namespace header1{
int func(){
foo();
}
}
header1 이름 공간에서 foo를 부른다면 알아서 header1::foo()를 호출한다. header1 이름 공간이라고 해서 header2의 함수를 못 불러 오는 것은 아니다. 아래의 코드를 보면 header2::foo()를 통해 header2 이름 공간에 있는 foo를 호출하는 것을 볼 수 있다.
#include "header1.h"
namespace header1{
int func(){
foo();
header2::foo();
}
}
위의 두 예시는 이름 공간안에서 호출하는 것이었다. 어떠한 이름 공간에도 소속되지 않은 경우라면 아래와 같이 명시적으로 이름 공간을 지정해야 한다.
#include "header1.h"
#include "header2.h"
int func(){
header1::foo();
}
하지만 만일 위 같은 foo를 여러번 반복적으로 호출하게 되는 경우 앞에 매번 header1::을 붙이기 귀찮다. 그래서 아래와 같이 앞으로 header1이란 이름 공간에 들어있는 foo만 사용할 것이라는 선언을 하면 header1::을 붙여주지 않아도 된다.
#include "header1.h"
#include "header2.h"
using header1::foo;
int func(){
foo(); //header1에 있는 함수를 호출
}
또한, 그냥 기본적으로 header1 이름 공간안에 정의된 모든 것들을 header1:: 없이 사용하고 싶다면 아래와 같이
"using namespace "뒤에 header1을 붙여 주면 된다.
#include "header1.h"
#include "header2.h"
using namespace header1;
int func(){
foo(); //header1에 있는 함수를 호출
bar(); //header1에 있는 함수를 호출
}
물론 이 경우 역시 header2에 있는 함수를 못 사용하는 것은 아니다. 아래와 같이 명시적으로 써주면 header2 이름공간의 함수를 사용할 수 있다.
#include "header1.h"
#include "header2.h"
using namespace header1;
int func(){
header2::foo(); //header2에 있는 함수를 호출
bar(); //header1에 있는 함수를 호출
}
이름 없는 이름 공간
C++에서는 이름 공간에 굳이 이름을 설정하지 않아도 된다. 이 경우 해당 이름 공간에 정의된 것들은 해당 파일 안에서만 접근할 수 있게 된다. 이 경우 마치 static 키워드를 사용한 것과 같은 효과를 낸다.
#include<iostream>
namespace{
int OnlyInThisFile(){}
int only_in_this_file=0;
}
int main(){
OnlyInThisFile();
only_in_this_file=3;
}
예를 들어서 위 경우 OnlyInThisFile 함수나 only_in_this_file 변수는 해당 파일 안에서만 접근할 수 있다. 헤더파일을 통해서 위 파일을 받았다 하더라도, 저 이름없이 정의된 namespace 안의 모든 것들은 사용할 수 없게 된다.
'Development > C & C++' 카테고리의 다른 글
[c++] 메모리 할당과 해제 (0) | 2020.12.18 |
---|---|
[c++] 배열의 레퍼런스 (0) | 2020.12.17 |
[c++] 상수에 대한 참조자 (0) | 2020.12.17 |
[c++] 함수 인자로 레퍼런스 받기 (0) | 2020.12.17 |
[c++] 참조자(레퍼런스) (0) | 2020.11.19 |