[C++] std, namespcae

2023. 8. 12. 20:31Programming Language/C++

728x90
  • std

std는 Standard Library(표준 라이브러리)의 네임스페이스(namespace)이다. 표준 라이브러리는 C++ 언어에 내장된 기능과 데이터 구조들의 집합으로, 다양한 작업을 수행하기 위해 필요한 함수, 클래스, 템플릿 등을 포함하고 있다. std 네임스페이스는 표준 라이브러리의 모든 요소들이 그룹화되어 있는 곳이다.

 

  • namespace

네임스페이스(namespace)는 C++에서 코드를 조직화하고 이름 충돌을 방지하기 위한 기술적인 도구다.이 네임스페이스는 코드 내의 식별자(변수, 함수, 클래스 등)들을 논리적인 그룹으로 분류하여 다른 네임스페이스와 구분되도록 한다. 이를 통해 다양한 라이브러리, 프로젝트 또는 모듈에서 같은 이름을 가진 식별자가 충돌하지 않도록 관리할 수 있다.

 

  • 예시1
namespace MyNamespace {
    // 여기에 식별자들을 선언 및 정의
    int x;
    void foo();
    class MyClass {
        // 클래스 멤버들
    };
}

위 예시에서 MyNamespace는 네임스페이스의 이름이다. 네임스페이스 내부에서 변수, 함수, 클래스 등을 정의하거나 선언할 수 있다. 해당 네임스페이스 내의 식별자에 접근하려면 MyNamespace::와 같이 범위 지정 연산자를 사용힌다.

int main() {
    MyNamespace::x = 42; // MyNamespace 안의 x에 접근
    MyNamespace::foo(); // MyNamespace 안의 foo 함수 호출

    MyNamespace::MyClass obj; // MyNamespace 안의 MyClass 타입 객체 생성
    return 0;
}

이렇게 함으로써 네임스페이스를 사용하여 코드를 논리적으로 분류하고 이름 충돌을 방지할 수 있습니다.

 

  • 예시2
#include <iostream>

namespace name1 {
    void foo() {
        std::cout << "This is foo in namespace name1" << std::endl;
    }
}

namespace name2 {
    void foo() {
        std::cout << "This is foo in namespace name2" << std::endl;
    }
}

int main() {
    name1::foo(); // name1의 foo 함수 호출
    name2::foo(); // name2의 foo 함수 호출
    return 0;
}

이 코드에서 name1 네임스페이스와 name2 네임스페이스는 각각 동일한 이름의 함수 foo를 가지고 있다. main 함수에서 name1::foo()를 호출하면 name1 네임스페이스에 정의된 foo 함수가 실행되며, name2::foo()를 호출하면 name2 네임스페이스에 정의된 foo 함수가 실행된다.

This is foo in namespace name1
This is foo in namespace name2

이렇게 코드에서 네임스페이스를 사용하면 동일한 이름의 함수라도 서로 다른 네임스페이스 내에서 별개의 함수로 취급되어 충돌이나 혼동을 방지할 수 있다.

 

 

  • ::

::는 범위 지정 연산자(scope resolution operator)로 사용되며, 다양한 상황에서 다른 네임스페이스(namespace), 클래스, 구조체 등의 멤버에 접근하는데 사용된다. 이 연산자는 코드 내에서 특정한 범위를 명시하여 식별자(변수, 함수, 클래스 등)를 참조할 때 사용된다.

 

  • ::를 사용하는 예시
namespace MyNamespace {
    int x;
}

// MyNamespace 안의 x에 접근
MyNamespace::x = 10;

 

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

[C++] 쓰레드 (thread)  (1) 2023.08.13
[C++] 객체, 함수 오버로딩  (0) 2023.08.13
[C++] 참조자  (0) 2023.08.13
[C++] STL  (0) 2023.08.11