본문 바로가기
프로그래밍 ( Programming )/C++

namespace(네임스페이스) 란, std

by Jayce_choi 2020. 12. 10.
반응형
네임스페이스 ( 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내부에 입출력에 관한 함수들을 가지고 있는 네임스페이스입니다.

iostream 내부

원래 c++ 설계 시 표준 라이브러리 관련된 모든 식별자들을 사용이 가능하였으나 다른 식별자들과의 이름 충돌이 존재했었기에 std namespace로 옮겼습니다.

때문에 기존에 우리가 using namespace를 사용을 안 하고 cin이나 cout을 사용하기 위해서는
std::cin과 같이 스코프 분석 연산을 붙여서 사용했었습니다. 

 


namespace의 의미와 using namespace std 의미를 알아보았습니다.
궁금하신 점이 있으시거나 수정이 필요한 사항에 대해서는 댓글 달아주시면 감사드리겠습니다! 

 

반응형

댓글