네임스페이스 ( namespace )
네임스페이스는 변수, 함수, 구조체, 클래스 등의 동일한 이름의 충돌 문제를 C++에서 해결하기 위해서 사용되는 영역입니다. 즉 특정한 유효 범위를 제공함으로써 프로그램 내부의 여러 라이브러리에 의한 내부 식별자 충돌을 막을 수 있습니다.
예시
- re.h
int Sum(int x, int y)
{
return x + y;
}
- re2.h
int Sum(int x, int y)
{
return x + y;
}
- main.cpp
#include<iostream>
#include"re.h"
#include"re2.h"
int main()
{
std::cout << Sum(1, 2);
return 0;
}
다른 헤더 파일 (re.h와 re.2)들이 동일한 Sum 함수를 가지고 메인에서 실행될 때
이름과 매개변수가 같은 함수가 같은 스코프에 있음으로써 이름 충돌이 발생하게 됩니다.
namespace를 사용해서 다시 작성해봅시다.
- re.h
namespace one {
int Sum(int x, int y)
{
return x + y;
}
}
- re2.h
namespace two
{
int Sum(int x, int y)
{
return x + y;
}
}
- main.cpp
#include<iostream>
#include"re.h"
#include"re2.h"
int main()
{
std::cout << one::Sum(1, 2);
return 0;
}
각각의 함수를 따로 특정 네임스페이스 이름 공간에 넣어주었습니다.
그리고 메인 문에서는 특정 네임 스페이스 이름을 스코프 분석 연산자(::)를 사용하여 해당 네임스페이스에 접근을 합니다.
때문에 해당 네임스페이스 안의 함수를 사용할 수 있게 되었습니다.
two 내부의 Sum을 이용할 때는 two::Sum(1,2)로 사용하면 됩니다.
추가 설명 ( 중첩, std, using )
네임스페이스는 중첩이 가능합니다. 해당 코드와 같이 out안에 in을 선언이 가능합니다.
마찬가지로 접근을 위해서는 스코프 분석 연산자를 통해서 x로 접근이 가능하게 됩니다.
#include<iostream>
namespace out
{
namespace in
{
int x = 5;
}
}
int main()
{
std::cout << out::in::x;
return 0;
}
우리가 항상 사용하는 using namespace std는 어떤 뜻인지 살펴보겠습니다.
- using은 using 지시 자라 고하며 명시한 네임스페이스에 속한 이름들을 모두 가져와 스코프 분석 연산자를 사용하지 않고도 사용할 수 있게 해 줍니다. 하지만 using 선언이 나타나는 선언 영역에서만 해당 이름을 사용할 수 있게 해 줍니다.
전역 범위에서 using 지시자가 사용됐을 경우 해당 네임스페이스의 이름들을 전역적으로 사용되게 되며 다른 곳에서는 사용이 안됩니다.
- std는 Standard로써 iostream내부에 입출력에 관한 함수들을 가지고 있는 네임스페이스입니다.
원래 c++ 설계 시 표준 라이브러리 관련된 모든 식별자들을 사용이 가능하였으나 다른 식별자들과의 이름 충돌이 존재했었기에 std namespace로 옮겼습니다.
때문에 기존에 우리가 using namespace를 사용을 안 하고 cin이나 cout을 사용하기 위해서는
std::cin과 같이 스코프 분석 연산을 붙여서 사용했었습니다.
namespace의 의미와 using namespace std 의미를 알아보았습니다.
궁금하신 점이 있으시거나 수정이 필요한 사항에 대해서는 댓글 달아주시면 감사드리겠습니다!
'프로그래밍 ( Programming ) > C++' 카테고리의 다른 글
[c++] 포인터 설명, 예제코드 (0) | 2021.01.17 |
---|---|
[C++] 함수 뒤에 Const 붙이는 이유 (0) | 2020.12.18 |
[C++]공백이 포함된 문자열 입력받는 함수 (0) | 2020.12.15 |
# 아스키 코드 ( ASCII Code ) 설명 및 출력 코드 (0) | 2020.12.09 |
[C++] STL 및 Container (0) | 2020.12.07 |
댓글