관리 메뉴

JIE0025

[C++] 이름공간 (namespace), 범위지정 연산자의 사용 본문

기타 학습/Language

[C++] 이름공간 (namespace), 범위지정 연산자의 사용

Kangjieun11 2022. 5. 6. 19:33
728x90

 

드디어 using namespace std;에 대한 개념을 파헤칠 차례군

C++ 로 코딩테스트 공부 급하게 준비하면서 맨날 쓰긴 썼는데 개념을 이제서야 공부한다. 

 

 

이름 공간 

특정 영역에 이름을 붙여주기 위한 문법적 요소

 

여러 사람의 협업이나, 많은 라이브러리를 사용하다 보면 식별자(변수, 함수 등)이 중복되는 경우가 생긴다.

이 경우 누가정의한건지, 무슨 라이브러리를 사용한건지 등등 식별자를 명시하기 위해서 사용함.

 

 

 

먼저 동일하게 이름이 철수인 사람을 구분하는 예로 들어 설명하는 걸 이해해보자.

두명의 철수가 한집에 사는 경우 "철수야!" 라고 부르면 어떤 철수를 부르는지 모른다.
서로 다른 집에 살 경우 문제가 되진 않는다. > A에 사는 철수, B에 사는 철수로 구분할 수 있기 때문이다.  

 

 

namespace 선언

namespace 이름 {

}

 

 

apple과 pear라는 namespace를 각각 선언하고 동일한 이름의 함수를 정의했다.

namespace의 함수를 호출하는 방법 >> apple::print(); 

( 범위지정 연산자 ::

 

이런형태  std::cin std::cout할 때 많이 보지 않았나..? ㅎㅎ

 

#include<iostream>

using namespace std;

namespace apple {
	void print() {
		cout << "apple print" << endl;
	}
}
namespace pear {
	void print() {
		cout << "pear print" << endl;
	}
}

int main() {

	apple::print();
	pear::print();

	return 0;
}

 

동일한 namespace안에서 다른 함수를 호출할 땐 namespace 명시는 필요 없다. 

 

 

namespace apple에 print와 testfunc를 정의하고,  testfunc 안에서 print호출, pear::print를 호출하는 예제이다.

#include<iostream>

using namespace std;

namespace apple {
	void print() {
		cout << "apple print" << endl;
	}
	void testfunc();
}
namespace pear {
	void print() {
		cout << "pear print" << endl;
	}
}

void apple::testfunc() {
	print(); 	// 동일 이름공간의 함수
	pear::print();  // 다른 이름공간의 함수
}

int main() {

	apple::testfunc();

	return 0;
}

 

namespace의 중첩

namespace안에 namespace를 삽입할 수 있다.

#include<iostream>

using namespace std;

namespace pear {
	int n = 100;
	namespace greenpear {
		int n = 10;
	}
}

int main() {

	cout << pear::n << endl;
	cout << pear::greenpear::n <<endl;
	
    return 0;
}

 

 

 

std::cin    std::cout    std::endl

드디어 콘솔 입출력시 자주 사용했던 cin cout endl이다.

 

이름공간 std에 선언된 cin, cout, endl을 의미한다. 

iostream 헤더 안에 namespace std가 있는데 그 안에 cin cout endl이 존재한다는것을 유추할 수 있다. 

 

 

 

 

using 을 이용해서 이름공간을 명시하기 

계속 std::를 사용하면 귀찮으니까 만들어진 선언이다. 

using namespace std ;

이 문장 하나로 cin >> n ; 이런식으로 바로 사용할 수 있음ㅎㅎ 아주 편리하다.

 

 

아래는 using pear::print(); 

print라는 함수를 namespace pear에서 찾아오는것인데

이후에 바로 print()를 사용할 수 있게 되었다. 

 

#include<iostream>
using namespace std;

namespace pear {
	void print() {
		cout << "pear print" << endl;
	}
	int n = 100;
	namespace greenpear {
		int n = 10;
	}
}

int main() {

	using pear::print;
	print();

	return 0;
}

 

 

 

using은 선언된 이후에 효력을 발휘, 선언된 지역을 벗어나면 효력을 잃게된다.

 

using namespace std;를 전역에 선언하는 이유가 바로 이것..! 

 

 

 

 

범위지정 연산자(::) scope resolution operator 의 응용

전역변수는 지역변수에 의하여 가려진다는 특징이 있다. 

변수의 이름이 같을 경우 지역변수의 우선순위가 높다는 뜻이다. 

 

#include<iostream>
using namespace std;

int n = 1111;
int scopeResolution() {
	int n = 2222;
	
	cout << n << endl;
	cout << ::n << endl;
	::n += 1;
	cout << ::n << endl;
	return 0;
}

int main(){
	scopeResolution();
	return 0;
}