- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[C/C++] namespace 와 범위지정 연산자 본문
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;
위와 같은 코드로 주소값을 출력해보면 서로 주소값이 다름을 확인할 수 있다.
[출처] [C++]namespace 와 범위지정 연산자|작성자 우기우기
'★─Programing > ☆─C | C++' 카테고리의 다른 글
[C/C++] 정보은닉과 캡슐화 (0) | 2009.10.12 |
---|---|
[C/C++] 객체지향프로그래밍(OOP) (0) | 2009.09.29 |
[C/C++] #include <iostream>(신버전) VS #include <iostream.h>(구버전) (0) | 2009.09.29 |
[C/C++] 닷넷2003에는 iostream.h가 없다!? (0) | 2009.09.29 |
[C/C++] rand() % M 사용하지 말라!!! (2) | 2009.02.03 |