알음알음-IT/개발_기초_코딩_C++

C++ 공부하기 - 4.이름공간(namespace)

구구닥스 2020. 2. 4. 14:27

오늘 배울 내용은 이름공간(namespace)입니다. 

이러한 이름공간이 필요한 이유부터 말씀드리겠습니다. 프로그램이 커지면서 코드도 점점 복잡하면서 대형화 되어갑니다.

그러다보니 개발자들이 서로 다른 부분을 맡아서 개발하게 됩니다. 모듈화해서 어디는 다리 어디는 몸통 어디는 팔 어디는 머리, 이런식으로 개발해서

나중에 조립을 한 셈이죠. 이런 개발 방식에서 큰 문제점이 생깁니다. 바로 함수의 이름이 겹치는 겁니다.

함수 이름이 같다보니 계속 코드는 충돌이나고 그렇다고 이미 쓴 코드에서 누가 뭘 바꾸고 누구는 안바꾸고 이런 문제가 발생할 수 있어서

미연에 방지하기 위해 생긴 것이 바로 이름공간(namespace)입니다.

 

이러한 이름공간의 기본적인 원리는 마치 원산지를 지정한 것과 같은 원리입니다. 같은 함수이지만 이건 국내산 이건 미국산 이건 중국산 이런식으로 출처

를 말해주니 필요한 부분에 적절한 함수가 들어가게 해주는 셈이죠.

 

그럼 간단한 코드로 보겠습니다.

같은 이름의 함수 Origin을 써도 이름공간을 써서 함수를 호출하면

충돌 없이 실행됩니다.

또 하나 알아두셔야 하는게 계속 보이는 :: 입니다. 범위지정 연산자라고 부릅니다.

우리가 자주 쓰는 std::cout, cin, endl 같은 함수도 std라는 이름공간 안에 있는 함수랍니다. 뿐만 아니라 지역변수 값을 건드리지 않고 전역 변수를 수정할 수 있답니다. ex) ::val+= 5 

 

 

함수는 선언과 정의를 분리해서 쓰는게 일반적입니다. 선언은 헤더파일에 정의는 소스파일에 저장하는게 일반적입니다. 이름공간도 전혀 다를게 없습니다.

이런식으로 사용합니다. 당연히 같은 이름공간에서 선언된 함수를 호출할때는 이름공간을 쓰지 않습니다.

 

그 다음으로 이름공간의 중첩에 대해 말씀드리겠습니다.

이 이름공간도 이름공간 안에 또 다른 이름공간을 쓸 쑤 있습니다.

코드로 설명드리겠습니다.

보시는 것처럼 Korea라는 이름공간안에 Origin이라는 이름공간이 중첩되서 사용되었습니다.

다만 이름공간 중첩을 너무 많이해서 길어지는 경우 별칭을 사용하여 간략하게 사용할 수 있습니다.

int main(void)

{

namespace KorOrigin Korea::Origin;     //라고 별칭을 써준다면

KorOrigin::Rice();

return 0;

{

이렇게 간략하게 사용할 수 있습니다.

 

이제 이름공간의 특징들을 배웠으니 더 나아가 using을 배우겠습니다.

이름공간을 배우고 using을 배우는 이유는 같이 쓰면 더 효율적이기 때문입니다.

코드로 보시겠습니다.

2행에 using namespace std; 는 std 이름공간 지정을 생략하고 쓸 수 있다는 말입니다.

보시면 std::cout 하던것이 그냥 cout을 해도 전혀 오류가 나지 않습니다.

using을 쓰기 때문에 확 편해졌죠?

대신

위와 같은 상황이 발생할 수 있습니다 무분별한 using의 사용은 함수 이름에 대한 충돌이 발생하게 됩니다.

그러니 적절한 사용으로 최고의 효율을 내시기 바랍니다.