본문 바로가기

C++

왜 C++ 인가 (namespace)

컴파일러, 운영체제, 상용 프로그램

특히 딥러닝 프레임워크는 모두 C++ 로 만들어져 있다.

프로그램의 성능이 중요한 부분에서 많이 쓰이고 있음

첫 C++ 프로그램

#include <iostream>

int main() {
    std::cout << "Hello, world!!" << std::endl;
    return 0;
}

1 : iostream 이란 헤더파일을 include 하고 있다.

iostream 헤더 파일은 C++ 에서 표준 입출력에 필요한 것들을 포함하고 있다.

 

3 : main 함수를 정의하는 부분

cout 앞의 std 는 C++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 namespace 이다.

이는 말그대로 어떤 정의된 객체에 대해 어디 소속인지 지정해주는 것과 동일하다. 코드의 크기가 늘어나면서 중복된 이름을 가진 함수들이 많아지는데 C++ 에서는 이를 구분하기 위해, 같은 이름이라도, 소속된 이름 공간이 다르면 다른 것으로 취급하게 한다.

namespace header1 {
    int foo();
    void bar();
}
namespace header2 {
    int foo();
    void bar();
}

두 가지의 namespace 파일,

자기 자신이 포함되어 있는 namespace 안에서는 이를 명시하지 않고 자유롭게 부를 수 있다.

#include "header1.h"

namespace header1 {
    int func(){
        foo();
    }
}

header1 namespace 안에서 foo 를 부른다면 알아서 header1::foo() 를 호출하게 된다. 

여기서 header2 의 foo 를 호출하기 위해서는 

#include "header1.h"
#include "header2.h"

namespace header1 {
    int func(){
        foo();
        header2::foo();
    }
}

반면 어떠한 namespace 에도 소속되지 않는 경우라면 명시적으로 name space 를 지정해야 한다.

 

기본적으로 header1 namespace 안에 정의된 모든 것들을 header1:: 없이 사용하고 싶다면

#include "header1.h"
#include "header2.h"

using namespace header1;

int main(){
    foo();
    bar();
}

위와 같이 using namespace header1 과 같이 명시하면 된다.

 

cout 과 endl 은 모두 iostream 헤더파일의 std 라는 이름 공간에 정의되어 있는 것들이다.

 

using namesopace std; 와 같이 name space 를 사용하겠다고 선언하는 것은 권장되지 않는다. 겹치는 이름의 함수로 인해 오류가 발생할 수 있기 때문,

 

cout 은 ostream 클래스의 객체로 표준 출력을 담당하고 있다.

 

이름 없는 이름 공간

C++ 에서는 이름 공간에 굳이 이름을 설정하지 않아도 된다.

이 경우 해당 이름 공간에 정의된 것들은 해당 파일 안에서만 접근할 ㅜㅅ 있게 된다.

#include <iostream>

namespace{
    int OnlyInThisFile(){}

    int only_in_this_file = 0;

    int main(){
        OnlyInThisFile();
        only_in_this_file = 3;
    }
}

 

'C++' 카테고리의 다른 글

4.2 함수의 오버로딩, 생성자  (0) 2024.06.29
4. 객체  (0) 2024.06.16
3. new, delete  (0) 2024.06.15
2. 참조  (1) 2024.06.15
1.2 C 와 C++ (기본 문법 비교)  (0) 2024.06.15