따배씨++ (12. Namespace)

김동우·2021년 2월 25일
0

안녕하십니까. 김동우입니다.

이번 글에서는 namespace, std가 뭔지 한 번 얘기해봅시다.

우리는 using namespace std 라는 코드를 이전 강의에서부터 점차 사용하기 시작했습니다.

그런데 이게 무슨 말이었는지 저는 따로 설명한 적 없었습니다.

이번 시간에는 그와 관련된 이야기를 조금 써볼까 합니다.

  1. 링크에러와 중복 선언

    지난 글에서 헤더가드가 함수를 중복해서 정의하고, 가져오는 것을 막아준다고 했습니다.

    그런데 namespace 또한 비슷한 역할을 하기 위해 고안된 개념입니다.

    namespace는 사실 다수의 개발자가 모여 개발을 하는 환경에서 매우 중요하게 여겨집니다.

    과거 여러 기능을 구현해야 하는 파일을 만들기 위해 결성된 팀이 있었고, 팀원들은 각자 맡은 기능들을 모두 구현해냈습니다.

    막바지에 이르러 각 파일들을 연결한 뒤 컴파일을 시도하게 되었고, 이 때 생각치도 못한 에러가 발생하는 것을 발견했습니다.

    바로 링크 에러, 중복 선언과 관련된 수도 없는 오류가 발생하는 것을 경험하게 된 것입니다.

    이유는 간단했습니다. 각자 동명의 함수를 선언했고, 해당 함수들을 다양한 파일에서 사용한 것이죠.

    프로젝트가 분할되었을 때에는 중복선언 문제를 경험할 일이 없었습니다. 헤더가드도 사용했고, 개인이 개발할 때는 동명의 함수를 사용한 적도 없었거든요.

    그렇다고 누가 함수명을 바꿀지 정하는 것은 개발에 있어 비효율적인 소모들을 낳을 뿐인데, 당시에는 그 방법 외에 마땅히 해결할 묘안이 없었습니다.

    이를 해결하기 위해 등장한 것이 namespace, 이름 공간입니다.

    namespace는 메모리를 아파트 단지로 비유했을 때, 동의 개념이 됩니다. 101동 202호 김철수와 102동 301호 김철수는 동명이인이고, namespace std의 cout과 내가 만든 임의의 namespace의 cout은 다른 함수가 되는 것입니다.

    실제로는 std의 함수와 동명으로 작명하시면 안됩니다.

    지금 당장은 이 정도로만 이해하시면 됩니다. 저 또한 포인터 강의 이전에는 이 정도로만 이해하기로 했습니다.

    각자 다른 주소가 존재한다는 것은, 우리가 임의로 선정한 자연어 네이밍과는 별개로 컴퓨터가 다 알아서 구분한다는 말이 됩니다.

    이전에 주소가 각자 존재하지 않았을 경우에는 어땠을까요?

    include 된 순서에 의해 가장 먼저 정의된 동명의 함수의 주소를 기준으로 여러번 중복선언되고, 자료형이 맞지도 않은 수식에 다른 함수들이 호출되었을겁니다.

    그러니 우리의 컴파일러는 이게 무슨 상황인지 벙찌게 되고, 실행 자체가 불가능하다는 판단을 내리게 되는 것입니다.

    자, 아래 코드를 첨부할테니 한 번 봅시다.

 #include <iostream>

namespace MySpace1
{
	namespace InnerSpace 
	{
		int my_function(int a) {

			return a; // 입력을 그대로 반환
		
		}
	}

	int doSomething(int a, int b) 
	{
		return a + b;
	}
}

namespace MySpace2
{

	int doSomething(int a, int b)
	{
		return a * b;
	}
}

using namespace std;

int main()
{
	using namespace MySpace1;
	using namespace MySpace1::InnerSpace;

	cout << my_function(100) << endl; // output : 100
	cout << doSomething(3,4) << endl; // output 7
	cout << MySpace2::doSomething(3,4) << endl; // ouyput 12

	return 0;

}

/*
 
namespace를 통해 동명의 함수가 한 파일에서 중복 선언되는 것을 막을 수 있다.
std 내부에는 C++ 표준 함수가 내장되어 있다. -> 이후 강의에서는 생략 예정

using namespace std; 라는 코드를 사용하는 상태에서
함수를 정의할 때는 std 내에 동명의 함수가 있는지 생각해야 한다.
-> 위 코드는 전역으로 선언하는 경우가 많기 때문이다.
-> 또한 지역에서 사용하는 것으로 선언할 수 있다.

namespace는 위 main()에서 사용하는 것과 같이 사용할 수 있다.
개인 프로젝트에서 2개 이상 되는 동명의 함수를 코딩하는 습관은 
사실 지양해야 한다.

팀 프로젝트 내에서 서로 맡은 패턴이나 기능이 다를 경우, 이를 하나로
합쳤을 때 동명의 함수가 상당히 많을 수 있기에 namespace가 필요하다.

즉, namespace라는 분리된 영역 내의 함수 정의와 다른 함수 블럭에서의 
namespace 사용은 개인 프로젝트보다 팀 단위 트로젝트에서 더욱 
중요할 수 밖에 없다.


*/

output에 집중해서 해당 파일의 구조와 진행을 이해해보시면 도움이 될 것 같습니다.

자, 그럼 이번 글은 여기서 마치도록 하겠습니다.

0개의 댓글

관련 채용 정보