이 책 자체가 Exceptional 이름을 갖고 있듯이, 총 4파트에 걸쳐 "예외적인 네임 스페이스"를 설명하고 있는 항목이다.

다음 코드를 보고, 어느 함수가 호출 될지 파악해 보자.

주의 : MSVC2005 에서 33라인의 함수 호출 모호성으로 컴파일이 되지 않습니다. 해결 방법으로 분석 ②에 정리해 두었습니다.

분석


  이 코드에서 5라인의 f는 .. 다음 순으로 이름을 찾게 된다.
  1. B::f( int i ) 함수를 찾는다.
  2. 1이 없다면 ::f( int i ) 함수를 찾는다.
  3. 없다면, 컴파일 타임 에러를 벹어 낸다.

결국 1번에 조건에 만족하기에, "재귀 함수 호출" 로써, 무한 반복 하게 된다.


  이 코드에서 3라인의 g는 어느 순으로 이름을 찾게 될까?
  1. A::g( A::X x ) 함수 or B::g( A::X x ) 함수를 찾는다.
  2. 1. 이 없다면, ::g( A::X x ) 함수를 찾는다.
  3. 컴파일 타임 에러를 벹어 낸다.

분석 ①과 차이가 있는것을 확인 할 수 있다. ②의 1. 의 뜻은 A 와 B 에서 동시에 g( A::X x ) 의 함수를 찾게 된다. 만약 A에 g()가 없다면 ①과 같이 "무한 재귀 함수 호출" 을 하게 되겠지만 B에도 g()가 있기 때문에, 컴파일러 입장에선 무엇을 호출해야 하는지 모호해 지게 된다.

"음!? A가 보여지 않는데 어째서 A::g() 를 찾지?" 라고 생각 한다면, 당신은 루키! 떠오르는 샛별! 일 것이다. 이런 의문은 바로 여기서 Exceptional namespace 규칙이 깔려 있다는 것을 몰랐기 때문이다.

우선 이런 컴파일 타임에 이름을 건색하는 알고리즘으로 Koenig 검색(Andrew Koenig 란 분의 이름을 딴...)을 사용 한다.

Koenig 검색 중 Exceptional인 부분
클래스 형식 이나 구조체 형식의 함수 매개변수를 제공하면, 컴파일러는 올바른 이름을 찾기 위해, 매개변수의 형을 담고 있는 네임스페이스를 고려한다.

이런 Koneing 검색을 통하여, 다음 코드가 잘 되는 것을 알 수 있을 것이다.


  자 이제 ②의 예제를 통하여 두가지 규칙을 알게 된다.
  1. Koneing 검색에 의해, 클래스 or 구조체 형식을 함수에 전달 할 경우, 그 함수는 그 클래스 or 구조체의 네임스페이스까지 함수가 있는 네임 스페이스와 동등한 위치에서 보이게 된다.
  2. 클래스 or 구조체 형식을 함수에 매개변수로 전달 할 경우, 1.의 규칙에 의해 동일한 이름을 가지고 있다면, 명시적으로 어느 것을 호출 하는지 컴파일러에게 알려야 한다.(using A::g; or B::g() 처럼)


 이 코드는 ②의 정리에 의하여, "무한 재귀 함수 호출" 이 된다.


이번 파트 1을 통하여, 네임스페이스의 의미에 한가지 사실이 결합 하게 된다. 그것은 "네임스페이스는 독립적이지 않다." 는 사실이다.

총평

정말 생소한 이야기라서, 이해하는데 조금 시간이 필요했다. 이번에 클래스 or 구조체에 또 다른 의미가 있다는 것을 알게 되었다. 음~ 재미있는 이야기 였고 파트2가 기대된다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기