ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 네임스페이스
    C++/이것이 C++이다 2021. 2. 12. 00:05

    네임스페이스란 C++의 각종 요소 (클래스, 함수, 변수)를 일정 [구역]으로 묶어주는 문법입니다.

    네임스페이스를 이용하게 되면 자칫 중복될 수 있는 클래스, 함수, 변수의 이름들을

    소속 네임스페이스라는 한단계 더 높은 그룹화가 가능해지므로

    규모의 프로젝트에서의 협업이 한층 더 용이해질 수 있습니다.

     


     

    1. 네임스페이스

     

    더보기

    네임스페이스란 클래스, 함수, 변수에 소속을 지정해주는 문법입니다.

     

    #include <iostream>
    
    namespace Sample{
        int sample_data = 10;
        
        void function(){
           std::cout << "Sample Function\n";
        }
    }
    
    void main(){
        std::cout << Sample::sample_data << "\n";
        Sample::function();
    }
    10
    Sample Function

    위와 같은 방식으로, namespace블록 안에 정의한 함수, 변수가 해당 네임스페이스의 소속이 됩니다.

    호출이나 참조시에는 :: 연산자를 이용합니다.

     

    cout과 cin에서, 혹은 다른 C++템플릿 혹은 함수에서 봤을 std또한 네임스페이스 입니다.

     

    2. using namespace

     

    더보기

    네임스페이스는 중복될 수 있는 이름들에 대한 소속을 지정, 그룹화를 통해 팀업을 용이하게 하는 용도로 사용할 수 있습니다.

    하지만, 그렇게 구성한 네임스페이스가 반대로 코드의 가독성을 해칠 수 있습니다.

     

    using namespace 지시문은 그러한 가독성에 대한 보완점이 될 수 있습니다.

    해당 지시문에 선언된 네임스페이스는 묵시적으로 선언된 것으로 취급합니다.

     

    Example (using namespace std)

    #include <iostream>
    
    using namespace std;
    
    void main(){
        cout << "Hello World!\n";
    }
    Hello World!

    하지만 가독성을 이유로 남용할 경우, 네임스페이스를 안 쓰는 것 만 못하는 경우가 생길 수 있습니다.

    언제나 적절한 타협점을 잘 찾을 수 있도록 합시다.

     

    3. 네임스페이스의 중첩

     

    더보기

    상술했듯이, 네임스페이스는 '소속'을 나타내는 문법입니다.

    하지만, '소속'이 한개여야만 한다는 규칙은 없습니다.

    네임스페이스는 계단식으로 중첩이 가능합니다.

     

    Example (네임스페이스의 중첩)

    #include <iostream>
    
    namespace Sample1{
        int sample_data = 10;
        
        namespace Sample2{
            int sample_data = 20;
            
            void function(){
                std::cout << "Sample2 Function\n";
            }
        }
        
        namespace Sample3{
            void function(){
                std::cout << "Sample3 Function\n";
            }
        }
    }
    
    void main(){
        std::cout << Sample1::sample_data << "\n";
        std::cout << Sample1::Sample2::sample_data << "\n";
        Sample1::Sample2::function();
        Sample1::Sample3::function();
    }
    10
    20
    Sample2 Function
    Sample3 Function

    중첩된 네임스페이스는 그 자체로 설계의도를 담을 수 있다고 합니다.

    하지만, 이 역시 소스코드의 가독성과 과도한 분할로 인한 개발 오버헤드가 발생할 수 있습니다.

    적정 선에 대한 내용을 차후 다른 글에서 다룰 수 있으면 좋겠습니다.

     

    4. 다중정의와 네임스페이스

     

    더보기

    앞선 글 (함수 기본)에서 함수 오버로딩에 대한 이야기를 해 보았습니다.

    매개변수의 타입, 개수 등에 차별을 둔, 같은 이름의 함수를 작성할 수 있다는 내용이었습니다.

    이번 문단의 다중 정의는 함수 다중 정의와는 다릅니다.

    본 항목의 핵심은, 네임스페이스가 다르다면 같은 함수가 있을 수 있다는 것 입니다.

     

    Example (다중정의와 네임스페이스)

    #include <iostream>
    
    void function(){
        std::cout << "Function\n";
    }
    
    namespace Sample{
        void function(){
            std::cout <<"Sample Function\n";
        }
    }
    
    void main(){
        function();
        ::function(); // Line 15
        Sample::function();
    }
    Function
    Function
    Sample Function

    Line 15라고 된 주석이 있는 Line을 보면, :: 연산자 앞에 아무런 네임스페이스가 존재하지 않음을 볼 수 있습니다.

    이것은 전역 네임스페이스라고 하며, 구조적으로 C++의 모든 함수, 변수는 전역 네임스페이스에 속한 것이 됩니다.

    네임스페이스가 존재하지 않는 클래스, 함수, 변수가 없음에 유의합시다.

     


     

    C++을 이용하면서 자주 사용하게 되는 네임스페이스로는 std가 있습니다.

    그 외에 어떤 네임스페이스가 자주 사용되는지는 아직 잘 알지 못하지만

    이것에 관한 글도 언젠간 쓸 수 있게 되기를 바랍니다.

    다음 글은 '클래스' 가 될 것 같습니다.

     

    짧지 않은 글 읽어주셔서 감사합니다.

    'C++ > 이것이 C++이다' 카테고리의 다른 글

    [C++] 클래스 기본 문법 1  (0) 2021.02.27
    [C++] 클래스를 살펴보기 전에  (0) 2021.02.27
    [C++] 함수 기본  (0) 2021.02.12
    [C++] C와 C++  (0) 2021.01.29
    [C++] 이 카테고리에서는  (0) 2021.01.29

    댓글

Designed by Tistory.