이 책 자체가 Exceptional 이름을 갖고 있듯이, 총 4파트에 걸쳐 "예외적인 네임 스페이스"를 설명하고 있는 항목이다.
다음 코드를 보고, 어느 함수가 호출 될지 파악해 보자.
주의 : MSVC2005 에서 33라인의 함수 호출 모호성으로 컴파일이 되지 않습니다. 해결 방법으로 분석 ②에 정리해 두었습니다.
이 코드에서 5라인의 f는 .. 다음 순으로 이름을 찾게 된다.
이 코드에서 3라인의 g는 어느 순으로 이름을 찾게 될까?
자 이제 ②의 예제를 통하여 두가지 규칙을 알게 된다.
이 코드는 ②의 정리에 의하여, "무한 재귀 함수 호출" 이 된다.
이번 파트 1을 통하여, 네임스페이스의 의미에 한가지 사실이 결합 하게 된다. 그것은 "네임스페이스는 독립적이지 않다." 는 사실이다.
다음 코드를 보고, 어느 함수가 호출 될지 파악해 보자.
주의 : MSVC2005 에서 33라인의 함수 호출 모호성으로 컴파일이 되지 않습니다. 해결 방법으로 분석 ②에 정리해 두었습니다.
분석
①
이 코드에서 5라인의 f는 .. 다음 순으로 이름을 찾게 된다.
- B::f( int i ) 함수를 찾는다.
- 1이 없다면 ::f( int i ) 함수를 찾는다.
- 없다면, 컴파일 타임 에러를 벹어 낸다.
결국 1번에 조건에 만족하기에, "재귀 함수 호출" 로써, 무한 반복 하게 된다.
②
이 코드에서 3라인의 g는 어느 순으로 이름을 찾게 될까?
- A::g( A::X x ) 함수 or B::g( A::X x ) 함수를 찾는다.
- 1. 이 없다면, ::g( A::X x ) 함수를 찾는다.
- 컴파일 타임 에러를 벹어 낸다.
분석 ①과 차이가 있는것을 확인 할 수 있다. ②의 1. 의 뜻은 A 와 B 에서 동시에 g( A::X x ) 의 함수를 찾게 된다. 만약 A에 g()가 없다면 ①과 같이 "무한 재귀 함수 호출" 을 하게 되겠지만 B에도 g()가 있기 때문에, 컴파일러 입장에선 무엇을 호출해야 하는지 모호해 지게 된다.
"음!? A가 보여지 않는데 어째서 A::g() 를 찾지?" 라고 생각 한다면, 당신은 루키! 떠오르는 샛별! 일 것이다. 이런 의문은 바로 여기서 Exceptional namespace 규칙이 깔려 있다는 것을 몰랐기 때문이다.
우선 이런 컴파일 타임에 이름을 건색하는 알고리즘으로 Koenig 검색(Andrew Koenig 란 분의 이름을 딴...)을 사용 한다.
Koenig 검색 중 Exceptional인 부분
클래스 형식 이나 구조체 형식의 함수 매개변수를 제공하면, 컴파일러는 올바른 이름을 찾기 위해, 매개변수의 형을 담고 있는 네임스페이스를 고려한다.
이런 Koneing 검색을 통하여, 다음 코드가 잘 되는 것을 알 수 있을 것이다.
자 이제 ②의 예제를 통하여 두가지 규칙을 알게 된다.
- Koneing 검색에 의해, 클래스 or 구조체 형식을 함수에 전달 할 경우, 그 함수는 그 클래스 or 구조체의 네임스페이스까지 함수가 있는 네임 스페이스와 동등한 위치에서 보이게 된다.
- 클래스 or 구조체 형식을 함수에 매개변수로 전달 할 경우, 1.의 규칙에 의해 동일한 이름을 가지고 있다면, 명시적으로 어느 것을 호출 하는지 컴파일러에게 알려야 한다.(using A::g; or B::g() 처럼)
③
이 코드는 ②의 정리에 의하여, "무한 재귀 함수 호출" 이 된다.
이번 파트 1을 통하여, 네임스페이스의 의미에 한가지 사실이 결합 하게 된다. 그것은 "네임스페이스는 독립적이지 않다." 는 사실이다.
총평
정말 생소한 이야기라서, 이해하는데 조금 시간이 필요했다. 이번에 클래스 or 구조체에 또 다른 의미가 있다는 것을 알게 되었다. 음~ 재미있는 이야기 였고 파트2가 기대된다.
'책 정리 > Exceptional C++' 카테고리의 다른 글
항목 27 : 컴파일 시간 의존성 줄이기 - 파트 2 (난이도 6) (0) | 2008.10.16 |
---|---|
항목 26 : 컴파일 시간 의존성 줄이기 - 파트 1 (난이도 4) (0) | 2008.10.16 |
항목 34 : 이름 검색과 인터페이스 - 파트 4 (난이도 9) (0) | 2008.10.16 |
항목 33 : 이름 검색과 인터페이스 - 파트 3 (난이도 5) (0) | 2008.10.16 |
항목 32 : 이름 검색과 인터페이스 - 파트 2 (난이도 9) (0) | 2008.10.15 |
항목 25 : 개체지향 프로그래밍 (난이도 4) (2) | 2008.10.14 |
항목 36 : 메모리 관리 - 파트 2 (난이도 6) (0) | 2008.10.11 |
항목 37 : AUTO_PTR (난이도 8) (0) | 2008.10.10 |
항목 35 : 메모리 관리 - 파트 1 (난이도 3) (0) | 2008.10.08 |
항목 41 : 개체 활동 주기 - 파트 2 (난이도 : 6) (0) | 2008.10.08 |
최근댓글