관리 메뉴

드럼치는 프로그래머

[C/C++] namespace 와 범위지정 연산자 본문

★─Programing/☆─C | C++

[C/C++] namespace 와 범위지정 연산자

드럼치는한동이 2009. 9. 29. 22:28

C++에는 C와는 다르게 namespace 라는 개념이 있다.

같은 이름의 변수나 함수들을 namespace 로 나누어 다르게 사용하는것을 뜻한다.

 
다음과 같은 코드를 보자

#include <stdio.h>

void func()

{

     printf("첫번째 func() 함수 호출\n");

}

void func()

{

     printf("두번째 funcB() 함수 호출\n");

}

int main()

{

     func();

     return 0;

}

다음과 같은 코드에서는 main() 함수에서 func() 호출 시 어떤 함수를 호출하려 하는지 알 수가 없다.

다음과 같은 코드는 C언어에서는 이미 func() 함수가 정의되어 있다는 에러 메세지를 두 번째 func() 함수 부분에서 발생하게 된다.

그럼 위의 코드를 C++ 기반으로 다시 작성해보자.

#include <iostream>

namespace A

{

    void func()

    {

         std::cout<<"두 번째 func() 함수"<<std::endl;

    }

}

namespace B

{

    void func()

    {

         std::cout<<"두 번째 func() 함수"<<std::endl;

    }

}

int main()

{

      A::func();      // namespace A 에 선언된 func() 함수 호출

     B::func();      // namespace B 에 선언된 func() 함수 호출

     return 0;

}

< 출력 결과 >

위와 같이 변경을 할 수 있다. namespace 를 사용하여 같은 이름의 func() 함수인데도 원하는 함수를 골라서 호출할 수 있게 된다.

main() 함수 내에서 사용된 A::func() 부분을 보면

A:: <- A라는 namespace 안에 정의된 부분을 찾아간다, 라고 보면 될 것이다. ( :: 콜론 두개는 범위지정 연산자(scope 연산자 라고 한다. )

이제 이 namespace를 사용하는 방법을 알아보자, 물론 위의 코드와 같이 A::func()   B::func() 와 같이 사용할 수도 있지만,

위의 main 함수를

using namespace A;

func();

using namespace B;

func();

라고 작성을 할 수도 있다.

using namespace A;   // 이 코드 다음부터는 A라는 namespace 공간을 찾아간다.

using namespace B;   // 이 코드 다음부터는 B라는 namespace 공간을 찾아간다.

이렇게 해 주고 함수 호출을 함수명만 사용하여 func() 라고 호출을 하여주어도 출력 결과는 같다.

위의 코드에서 사용한 std::cout    std::endl  도

std의 공간에 선언되어있는 cout 과 endl 을 사용한다는 의미이다.

프로그램 선두 부분에

using namespace std;

를 선언해두면 cout 과 endl 을 사용할 때

std:: 를 빼주고 cout<<"두 번째 func() 함수"<<endl;  와 같이 사용해줄 수 있다.

변수의 지정범위 다르게 되면 변수의 이름을 같게 선언을 해 줄 수가 있다. 가령

#include <iostream>

using namespace std;

int val = 0;  // 전역으로 a변수 선언

class A {

      int val;

};

int main()

{

      A a;

      int val;

      val = 10;

      cout<<"val의 값 출력 : "<<val<<endl;

      return 0;

}

다음과 같이 val라는 이름으로 전역변수로 하나, 클래스의 멤버변수로 하나, main 함수 내의 지역변수로 하나가 선언이 되어있다고 치면

val = 10; 이라는 문장은 과연 어떤 val 변수에게 10 이라는 값을 대입을 해 줄 것인가...

변수의 이름이 같다면 언제나 지역 변수가 가장 우선시 되게 된다.

< 출력 결과 >

그렇다면 다른 부분에 선언된 val 변수에 접근하려고 하면 어떻게 해야 할까?

객체 a의 멤버 val 이야 a.val 과 같이 접근을 하면 될것이고,

전역 변수 val은 어떤 방법으로 접근을 할 수 있을까?

이때 사용되는 것이 scope 연산자 ( :: ) 이다.

::val = 10;          // 전역 범위에 선언된 val 변수에 10 할당

위와 같은 방법으로 접근할 수 있다.

 cout<<"val의 값 출력 : "<<&val<<endl;
 cout<<"val의 값 출력 : "<<&::val<<endl; 

위와 같은 코드로 주소값을 출력해보면 서로 주소값이 다름을 확인할 수 있다.


Comments