[이것이 C++이다] Part 01. C에서 C++로 문법 전환하기 (4)

2.3 인라인 함수

  • 함수 호출에 의한 오버헤드를 줄이기 위해 보통 매크로를 사용합니다.
    • 함수 호출 시 스택 메모리 사용 증가, 매개변수 메모리 복사, 스택 조정, 제어 이동 등의 작업이 이루어 집니다.
  • 하지만 함수가 아닌 매크로는 가독성, 논리적 오류 등 여러 문제의 원인이 될 수 있습니다.
  • 이러한 매크로를 대신해 인라인 함수를 사용할 수 있습니다.
    • 함수와 사용법은 동일하나 내부적으로는 매크로처럼 함수를 호출하지는 않습니다.
  • 같은 코드가 기계어에 반복적으로 등장할 수 있기 때문에 일정 길이 수준 이상의 코드는 인라인 함수로 작성하지 않는 것이 더 좋습니다.

    inline int Add(int a, int b) {
      return a+b;
    }
    

2.4 Namespace

2.4.1 namespace

  • namespace 키워드를 사용해 변수와 함수들을 하나의 소속으로 묶을 수 있습니다.
  • 아래 예제에서 namespace는 TEST, std, global(전역) 세 가지 입니다.
  • C++ 에서 namespace에 포함되지 않는 식별자는 없습니다. (최소 전역)

    namespace TEST {
      int nData = 100;
      void testFunc(void) {
        std::cout << "TEST::testFunc()" << std::endl;
      }
    }
    
    int main(void) {
      TEST::testFunc();
      std::cout << TEST::nData << std::endl;
      return 0;
    }
    // TEST::testFunc()
    // 100
    

2.4.2 using

  • using 키워드로 소속을 감출 수 있습니다.

    using namespace std;
    

2.4.3 중첩

  • namespace 안에 또 다른 namespace가 속할 수 있습니다.

2.4.4 namespace와 다중정의

  • namespace를 직접 기술하여 호출을 구별해야 합니다.
  • 소속이 다르면 이름이 같아도 다른 함수/변수 입니다.

    namespace TEST {
      int test_data;
    
      namespace TEST_DEV {
        int test_data;
      }
    }
    // TEST::test_data
    // TEST::TEST_DEV::test_data 
    // 두 변수는 다른 변수다.
    

2.5 식별자 검색 순서

  1. 현재 블록 범위
  2. 상위 블록 범위 (함수 Body)
  3. 클래스 멤버
  4. 부모 클래스 멤버
  5. 가장 최근에 선언된 전역 함수/변수
  6. 상위 Namespace
  7. using 선언된 식별자 or 전역 식별자 (모호성 주의)