[C++] 네임스페이스(namespace)

2024. 1. 30. 02:30·Programming Language(Sub)/C++

네임스페이스(namespace)


  • 네임스페이스(namespace)는 프로그래밍에서 식별자(identifier)들의 범위를 나타내는 개념

  • 변수, 함수, 클래스 등과 같은 여러 종류의 식별자들이 유일한 이름을 가지고 충돌하지 않도록 하는 데 사용

  • 네임스페이스 프로토 타입

    int n; // global variable
    void set();  // 프로토타입
    
    namespace junseo {  // 프로토타입
    int n;
    void set();
    }  // namespace junseo
    
    namespace google { // 프로토타입
    int n;
    void set();
    }  // namespace google
  • 전역(global) 식별자와 네임스페이스에 속한 식별자 표기

    void EX1(void) {
        ::set(); // global set 함수
        junseo::set(); // namespace junseo에 속한 set 함수
        google::set(); // namespace google에 속한 set 함수
        cout << ::n << endl;
        cout << junseo::n << endl;
        cout << google::n << endl;
    }
  • 변수의 소속을 밝히지 않은 경우

    int n; // global variable
    void set();  // 프로토타입
    
    void set() {
        ::n = 10; // 명시적 전역변수
    }
    
    namespace junseo {  // 프로토타입
    int n;
    void set();
    }  // namespace junseo
    
    namespace junseo {
    void set() {
        n = 20;  // 변수의 소속을 밝히지 않은 경우 네임스페이스 안에있는 변수를 사용한다. 여기선 junseo::n = 20;
    }
    }  // namespace junseo
    • 변수의 소속을 밝히지 않은 경우 네임스페이스 안에 있는 변수를 사용

    • 위 의 예시에서 junseo에 속한 set 함수의 경우 n은 namespace junseo에 속한 n

  • 프로토타입으로 선언된 함수를 따로 정의하는 다른 방법

    namespace google {
    int n;
    void set();
    }  // namespace google
    
    void google::set() {
        n = 30;
    }
    • 함수의 namespace를 밝혀주면 namespace 전부를 따로 정의하지 않아도 된다
  • 식별자 검색 (프로토 타입을 사용하지 않고 바로 정의한 경우)

    int n;
    void set() {
        n = 10;
    }
    
    namespace junseo {
        int n;
        void set() {
            n = 20;
        }
        namespace google {
            void set() {
                n = 30;  // junseo의 n을 30으로 초기화. (컴파일러가 위에서 아래로 읽기 때문에 아직 선언되지 않은 google의 n 대신 junseo의 n을 30으로 변경)
            }
            int n;  // 컴파일러가 set을 만난 후에 n이 선언됨을 확인해서 set함수로 초기화 x. 하지만 프로토타입 사용 시에는 네임스페이스 안의 변수에 대입.
        }  // namespace google
    }  // namespace junseo
    • 컴파일러가 네임스페이스의 코드를 위에서 부터 아래로 읽음

    • 컴파일러가 google::set 함수를 읽을 때 google::n은 아직 읽지 않은 상태임

    • 따라서 google::set에서 n은 junseo::n

    • 프로토타입을 이용하면 해당 namespace에 해당하는 n에 값을 저장하게 됨

    int n;
    void set() {
        n = 10;
    }
    
    namespace junseo {
        void set() {
            n = 20;
        }
        int n;
        namespace google {
            void set() {
                n = 30;  // junseo의 n을 30으로 초기화. (컴파일러가 위에서 아래로 읽기 때문에 아직 선언되지 않은 google의 n 대신 junseo의 n을 30으로 변경)
            }
            int n;  // 컴파일러가 set을 만난 후에 n이 선언됨을 확인해서 set함수로 초기화 x. 하지만 프로토타입 사용 시에는 네임스페이스 안의 변수에 대입.
        }  // namespace google
    }  // namespace junseo
    • 위 코드에선 junseo::set()의 정의 이전에 junseo::n의 선언이 등장하지 않으므로 ::n에 20을 저장하게 된다

참조) 두들낙서 C/CPP 강의

'Programming Language(Sub) > C++' 카테고리의 다른 글

[C++] 상수형 매개변수와 상수형 메서드  (0) 2024.02.04
[C++] 클래스(Class) (2) - 정적 멤버, 정적 메서드  (0) 2024.01.30
[C++] 클래스(Class) (1)  (0) 2024.01.30
[C++] C++ 스타일 함수  (0) 2024.01.29
[C++] C++ 스타일 문법  (0) 2024.01.28
'Programming Language(Sub)/C++' 카테고리의 다른 글
  • [C++] 클래스(Class) (2) - 정적 멤버, 정적 메서드
  • [C++] 클래스(Class) (1)
  • [C++] C++ 스타일 함수
  • [C++] C++ 스타일 문법
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[C++] 네임스페이스(namespace)
상단으로

티스토리툴바