네임스페이스 키워드는 무엇에 사용됩니까? 클래스 및 네임스페이스. 네임스페이스 선언




클래스와 네임스페이스

.NET Framework 클래스

적어도 개발자의 관점에서 볼 때 관리 코드 작성의 가장 큰 이점은 아마도 다음을 사용할 수 있다는 것입니다. .NET 기본 클래스 라이브러리 .

.NET 핵심 클래스는 이전에 Windows API를 사용하여 해결할 수 있었던 거의 모든 문제를 해결할 수 있는 대규모 관리 코드 클래스 컬렉션을 제공합니다. 이러한 클래스는 모두 단일 상속을 사용하는 동일한 IL 개체 모델을 따릅니다. 즉, .NET 기본 클래스에서 개체를 만들거나 해당 클래스에서 고유한 클래스를 상속할 수 있습니다.

.NET 기본 클래스가 다른 점은 직관적이고 사용하기 쉽게 디자인되었다는 것입니다. 예를 들어 스레드를 시작하려면 클래스의 Start() 메서드를 호출해야 합니다. . TextBox 개체를 사용할 수 없게 하려면 개체의 Enabled 속성을 false로 설정하십시오. 라이브러리가 사용하기 쉬운 Visual Basic 및 Java 개발자에게 친숙한 이 접근 방식은 다음과 같이 GetDIBits(), RegisterWndClassEx() 및 IsEqualIID()와 같은 API 기능으로 수년을 고생해온 C++ 개발자에게 큰 안도감을 줄 것입니다. 창 핸들 전달이 필요한 많은 기능도 있습니다.

그러나 C++ 개발자는 항상 전체 Windows API 세트에 쉽게 액세스할 수 있었던 반면, Visual Basic 6 및 Java 개발자는 해당 언어에서 액세스하는 핵심 운영 체제 기능으로 제한되었습니다. .NET 기본 클래스는 Visual Basic 및 Java 라이브러리의 사용 용이성과 비교적 완전한 Windows API 기능 세트를 결합합니다. 많은 Windows 기능은 기본 클래스를 통해 액세스할 수 없으며 이러한 경우 API 기능을 사용해야 하지만 일반적으로 이는 가장 이국적인 기능에만 적용됩니다. 일상적인 사용에는 일반적으로 기본 클래스 세트로 충분합니다. 그러나 API 함수를 호출해야 하는 경우 .NET은 소위 말하는 기능을 제공합니다. 플랫폼 호출 메커니즘, 이는 올바른 데이터 유형 변환을 보장하므로 이제 이 작업은 코드가 작성된 언어(C#, C++ 또는 Visual Basic 2010)에 관계없이 C++ 코드에서 직접 이러한 함수를 호출하는 것보다 어렵지 않습니다.

네임스페이스

네임스페이스.NET이 클래스 간의 이름 지정 충돌을 방지하는 방법입니다. 이는 고객을 나타내는 클래스를 정의하고 이를 Customer라고 부르면 다른 사람이 동일한 작업을 수행하는 상황을 방지하기 위한 것입니다(이는 매우 일반적인 시나리오입니다).

네임스페이스는 데이터 유형 그룹에 지나지 않지만 네임스페이스 내의 모든 데이터 유형 이름에는 자동으로 네임스페이스 이름 접두사가 붙는 효과가 있습니다. 네임스페이스는 서로 중첩될 수 있습니다. 예를 들어 대부분의 범용 .NET 기본 클래스는 네임스페이스에서 찾을 수 있습니다. 체계. 기본 클래스 정렬이 공간을 의미하므로 전체 이름은 다음과 같습니다. 시스템.배열.

.NET 플랫폼에서는 모든 이름이 네임스페이스 내에서 선언되어야 합니다. 예를 들어 수업을 넣을 수 있습니다 내 수업네임스페이스에 내 회사. 그러면 이 클래스의 전체 이름은 다음과 같습니다. 내회사.내클래스.

네임스페이스를 명시적으로 지정하지 않으면 이름이 지정되지 않은 전역 네임스페이스에 유형이 추가됩니다.

대부분의 상황에서 Microsoft는 두 개 이상의 중첩된 네임스페이스를 사용할 것을 권장합니다. 첫 번째는 회사 이름이고 두 번째는 클래스가 속한 기술 또는 소프트웨어 패키지의 이름이므로 다음과 같습니다. MyCompany.SomeNamespace .내 수업. 대부분의 경우 이 접근 방식은 다른 회사의 개발자가 작성한 클래스 이름과 잠재적인 충돌로부터 애플리케이션의 클래스를 보호합니다.

다음 표는 .NET에서 제공되는 일부(전부는 아님) 네임스페이스의 간단한 목록으로, 기능에 따라 그룹으로 구분되어 있습니다.

.NET Framework 키 네임스페이스
.NET의 네임스페이스 설명
체계 네임스페이스 내부 체계내부 데이터, 수학, 난수 생성, 환경 변수 및 가비지 수집을 처리하는 데 유용한 유형은 물론 일반적으로 사용되는 여러 예외 및 속성이 포함되어 있습니다.
시스템.컬렉션
시스템.컬렉션.일반
이러한 네임스페이스에는 다양한 컨테이너 유형뿐만 아니라 특수 컬렉션을 생성할 수 있는 여러 기본 유형 및 인터페이스가 포함되어 있습니다.
시스템.데이터
시스템.데이터.공통
시스템.데이터.엔티티클라이언트
시스템.데이터.Sql클라이언트
이러한 네임스페이스는 ADO.NET을 사용하여 데이터베이스와 상호 작용하는 데 사용됩니다.
시스템.IO
시스템.IO.압축
시스템.IO.포트
이러한 공간에는 파일 I/O, 데이터 압축 및 포트 조작을 처리하도록 설계된 다양한 유형이 포함되어 있습니다.
시스템.반사
시스템.반사.방출
이러한 네임스페이스에는 런타임 유형 검색과 동적 유형 생성을 지원하는 유형이 포함되어 있습니다.
System.Runtime.InteropServices 이 네임스페이스에는 .NET 유형이 "관리되지 않는 코드"(예: C 기반 DLL 및 COM 서버)와 상호 작용하거나 그 반대로 상호 작용할 수 있는 수단이 포함되어 있습니다.
시스템.드로잉
시스템.Windows.양식
이러한 네임스페이스에는 기본 .NET(Windows Forms) 그래픽 도구 세트를 사용하여 데스크톱 애플리케이션을 구축하는 데 사용되는 유형이 포함되어 있습니다.
시스템.Windows
시스템.Windows.컨트롤
시스템.Windows.Shapes
공간 시스템.Windows WPF(Windows Presentation Foundation) 그래픽 도구 집합을 나타내는 여러 네임스페이스 중 루트입니다.
시스템.Linq
시스템.Xml.Linq
System.Data.DataSetExtensions
이러한 네임스페이스에는 LINQ API를 사용하여 프로그래밍을 수행할 때 사용되는 형식이 포함되어 있습니다.
시스템.웹 이 네임스페이스는 ASP.NET 웹 애플리케이션을 만들 수 있는 많은 네임스페이스 중 하나입니다.
시스템.서비스모델 이 네임스페이스는 WCF(Windows Communication Foundation) API를 사용하여 분산 애플리케이션을 만드는 데 사용할 수 있는 많은 네임스페이스 중 하나입니다.
시스템.워크플로.런타임
시스템.워크플로.활동
이 두 네임스페이스는 WWF(Windows Workflow Foundation) API를 사용하여 워크플로 지원 응용 프로그램을 구축하는 데 사용되는 유형을 포함하는 많은 네임스페이스의 주요 대표자입니다.
시스템.스레딩
시스템.스레딩.작업
이 네임스페이스에는 여러 CPU에 작업 부하를 분산할 수 있는 다중 스레드 애플리케이션을 구축하기 위한 다양한 유형이 포함되어 있습니다.
시스템.보안 보안은 .NET 세계에 내재되어 있습니다. 보안 관련 네임스페이스에는 권한, 암호화 보안 등을 처리하는 다양한 유형이 포함되어 있습니다.
시스템.Xml 이 XML 지향 네임스페이스에는 XML 데이터와 상호 작용하는 데 사용할 수 있는 다양한 유형이 포함되어 있습니다.

Microsoft 루트 공간의 역할

표의 목록을 살펴보면 System 네임스페이스가 상당한 수의 중첩된 네임스페이스(예: System.IO, System.Data 등)의 루트라는 것을 쉽게 알 수 있습니다. 그러나 알고 보니 System 외에도 기본 클래스 라이브러리는 여러 가지 다른 최상위 루트 네임스페이스도 제공하는데, 그 중 가장 유용한 것은 다음과 같습니다. 마이크로소프트 네임스페이스.

네임스페이스 std를 사용하는 것이 무엇인지에 대한 질문에 대답하려면 먼저 설명된 용어를 영어로 번역하면 다양한 식별 형식을 정의하는 데 필요한 선언 범위인 네임스페이스를 의미한다는 점에 유의해야 합니다. 함수 및 종속/독립 변수.

덕분에 여러 변수가 동일한 값을 갖는 상황이 발생하기 때문에 이름 간에 충돌이 없습니다. 일반적으로 이는 다른 라이브러리가 생성될 때 발생합니다.

식별자는 서로 관련하여 자유롭게 사용할 수 있습니다. 성명 형식을 사용하면 독립 회원에게 무료로 액세스할 수 있습니다.

이를 위해서는 매우 중요합니다.객체가 네임스페이스 std를 사용하는 이름의 전체 형식을 포함하도록 합니다. 이는 선언이 공간 이름에 배치될 때 어떻게 보이는지 시각적으로 이해하는 데 중요합니다.

이미지는 인코딩에 대한 액세스의 여러 변형을 보여줍니다. 울타리 안팎에 위치:

1 이런 모습이에요 이름:

2 기존 광고를 보완하기 위해 다음을 사용하여 추가:

3 기존 ID를 모두 추가하려면, 적절한 지시문을 사용하십시오.

지시문 사용

using 지시문을 사용하면 네임스페이스에 포함된 사용 가능한 모든 이름을 활용할 수 있습니다.

한정자를 지정할 필요가 없습니다.

cpp 형식 파일에서는 using을 사용해야 합니다.그러나 중요한 조건은 여러 식별자가 있다는 것입니다.

이름이 두 개뿐인 경우에는 일반적인 이름을 만드는 것이 적합합니다.

그런 다음 필요한 식별자만 추가하고 나머지는 그대로 둘 수 있습니다.

로컬 변수의 이름과 기본 변수의 이름이 일치하는 경우 이 경우 첫 번째 변수는 숨겨진 액세스에 있다는 점에 유의하는 것이 중요합니다.

동일한 이름으로 변수를 생성하는 것은 불법입니다.

조언!사용 편의성을 위해 using 지시문을 cpp.형식 파일의 상단에 배치하거나 그 반대로 생성된 라이브러리 내에 배치할 수 있습니다.

가장 편안한 작업 조건을 보장하기 위해 필요한 파일 배치 작업을 수행할 수 있습니다.

반드시 필요한 경우가 아니면 using 지시문을 배치하면 안 됩니다. H 형식 파일의 헤더에.

이는 이 작업을 수행하면 가시성 분야에서 모든 식별자가 활성화되어 일부 이름이 충돌할 가능성이 높아지기 때문입니다.

파일의 경우 가장 좋은 해결 방법은 전체 이름을 사용하는 것입니다.

너무 긴 경우 별칭 형태로 약어를 사용할 수 있습니다.

네임스페이스 선언

파일 이름 형태로 광고를 배치하는 것이 일반적입니다. 지정된 함수의 실행이 별도의 라이브러리나 파일에 있는 경우 전체 이름을 결정하는 것이 중요합니다.

우리가 말하는 행동을 이해하려면 가치가 있습니다. 다음 이미지를 확인하세요.

cpp.format contosodata 함수를 구현하려면 경우에 전체 이름을 사용하는 것도 중요합니다. 지시문이 맨 처음에 있을 때:

네임스페이스 std를 사용합니다. 동일한 파일에 있는 여러 섹션에 동시에 광고가 포함될 수 있습니다.

컴파일러로 인해 데이터가 처리되는 동안 모든 요소가 결합됩니다.

예를 들어 std.는 일반적으로 표준 유형의 액세스 가능한 라이브러리에 있는 액세스 가능한 파일의 모든 헤더에서 선언됩니다.

정규화된 이름으로 지정된 멤버는 네임스페이스 내에서뿐만 아니라 명시적인 자격이 있는 경우 네임스페이스 외부에서도 정의될 수 있습니다.

정의는 생성된 네임스페이스에서 선언 뒤에 와야 합니다.

시각적 예로서 다음 이미지에 주목하세요.

대부분의 경우 이 오류는 정의 순서를 위반하거나 전체 이름의 구성 부분이 사용 가능한 개체에 즉시 포함될 때 나타납니다.

특정 네임스페이스에 쿠키가 선언되지 않은 경우, 공식적으로는 전역 유형의 공간에 속합니다.

조언!반드시 필요한 경우가 아니면 전역 유형 공간에 멤버를 포함하지 않는 것이 좋습니다.

규칙에 대한 중요한 예외는 다음과 같습니다. 주요 옵션, 넓은 공간에 의무적으로 포함됨을 의미합니다.

전역 유형 식별자를 생성하려면 전체 이름 형식으로 해당 가시성 기능을 사용해야 합니다.

이 작업은 다른 네임스페이스에 있는 다른 기존 식별자와 하나의 식별자에 대한 고유한 속성을 만드는 데 도움이 됩니다.

이는 코드를 이해하는 데 도움이 됩니다.

우주 표준.

공간이 중첩 유형일 수 있다는 점은 주목할 가치가 있습니다.

일반적인 임베딩을 의미한다면 전체 공간에 대해 무제한의 특성을 갖습니다.

상위 멤버라고 하면 그런 기능이 없습니다.

확장을 위해서는 내장 어태치먼트가 필요합니다.

좀 더 정확한 정의와 이해를 위해 다음 이미지에 주의하세요.

추가 구현을 위한 정보를 캡슐화하여 일반 중첩 공간의 일부가 될 수도 있고 상위 공간에서 개방형 인터페이스 역할을 할 수도 있습니다.

비교는 상위 네임스페이스의 기본 제공 멤버인 표준 유형의 일반 첨부 파일입니다.

결과적으로 인수의 종속성이 있는 일종의 오버로드가 있는 함수 검색을 사용할 수 있습니다.

바인딩이 수행되는 방법의 예를 보려면 다음을 수행하세요. 다음 예를 참고할 가치가 있습니다.

다음 이미지는 상위 공간 템플릿의 특수화 프로세스를 보여줍니다. 내장 유형의 임시 공간에 선언됩니다.

내장된 공간을 활용함으로써 표준 라이브러리에서 다양한 버전의 인터페이스를 관리하는 것이 가능합니다.

하나의 단일 상위 공간을 생성하고 제시된 각 인터페이스를 캡슐화하는 것이 가능합니다.

그러나 공유된 상위 공간의 첨부 파일 형식이어야 합니다.

그런 다음 클라이언트 코드가 새 조합에 자동으로 할당됩니다.

이전 버전 사용에 익숙해진 사용자들은 문제없이 계속해서 사용하실 수 있습니다.

이렇게 하려면 첨부 파일에 대한 전체 경로를 만들어야 합니다.

첫 번째 공지사항을 구성하려면 인라인 키를 사용해야 합니다.

각각 공간이 있는 두 가지 인터페이스 옵션의 다음 예를 살펴보겠습니다. 클라이언트 코드에는 새로운 라이브러리를 활용하는 기능도 있습니다.

프로세스를 시각화하려면 다음 이미지로 넘어가겠습니다.

모든 이름은 매우 고유해야 하므로 길이가 상당히 늘어납니다.

그러나 여기에서는 using 지시문을 사용할 수 없습니다.

네임스페이스에 대한 별칭만 생성할 수 있습니다.

이 경우 다음 예를 고려하십시오.

일반 공간을 생성하는 것도 가능하지만 별칭이 지정되지는 않습니다.

이러한 영토 스펙트럼을 익명이라고 합니다.

일반적으로 선언의 멤버가 다른 개체의 인코딩을 위해 보이지 않아야 하는 상황에서 사용됩니다.

전체 구조는 모든 식별자를 볼 수 있지만 생성된 공간 외부에서는 보이지 않는 상태로 유지됩니다.

주목할 만한 가치가 있다, 네임스페이스 자체도 블록 외부에서 보이지 않으므로 각 사용자는 이 세부 사항을 미리 기록해 두어야 합니다.

일반적으로 Visual C++로 작업하는 경우 지식을 활용하는 것이 필요합니다.

고품질 예제를 사용하면 이 주제를 이해하는 것이 훨씬 쉬울 것입니다.

C++의 네임스페이스란 무엇입니까?

네임스페이스는 논리적으로 관련된 선언을 공통 이름으로 그룹화하는 방법입니다.

네임스페이스 예:

// @author Subbotin B.P..h" 네임스페이스 첫 번째( int a; float b; ) 네임스페이스 두 번째( int a; float b; ) int _tmain(int argc, _TCHAR* argv) ( first::a = 1; 두 번째:: a = 2; 첫 번째::b = 1.23; 두 번째::b = 4.56; printf("\n첫 번째::a = %d\n", 첫 번째::a); printf("\n두 번째::a = %d \n", 두 번째::a); printf("\n첫 번째::b = %.2f\n", 첫 번째::b); printf("\n두 번째::b = %.2f\n\n", 두 번째::b); 0을 반환; )

우리는 다음을 얻습니다:

이 예에서는 두 개의 네임스페이스(first 및 second)가 생성됩니다. 두 공간 모두 동일한 변수를 포함합니다. 그러나 예를 들어 변수 a는 다른 네임스페이스의 변수와 혼동될 수 없도록 먼저 공간에 속한다는 사실입니다. 이렇게 하면 이름 충돌이 방지됩니다.

첫 번째 네임스페이스에 선언된 int 변수가 사용된다는 의미입니다. 이는 using 선언의 예입니다. :: 연산자를 범위 지정 연산자라고 합니다.

네임스페이스는 네임스페이스 키워드를 사용하여 생성됩니다.

네임스페이스 우선( int a; float b; )

네임스페이스의 모든 이름을 사용하려면 using 네임스페이스 지시문을 사용할 수 있습니다. 네임스페이스 std 사용 예:

네임스페이스 std 사용; int _tmain(int argc, _TCHAR* argv) ( cout<<"\n using namespace std \n"<

네임스페이스 std를 사용하면 std 네임스페이스의 이름을 사용할 수 있습니다. std는 C++ 표준 라이브러리의 이름입니다.

마지막 예에서 네임스페이스 std를 사용하여 네임스페이스 연결 문자열을 제거하는 경우 네임스페이스 이름을 명시적으로 지정해야 합니다.

// @author Subbotin B.P..h" #include int _tmain(int argc, _TCHAR* argv) ( std::cout<<"\n using namespace std \n"<

네임스페이스는 범위를 정의합니다. 예제에서는 네임스페이스를 명시적으로 정의했습니다. 다음은 네임스페이스의 다른 예입니다. 함수 내의 범위도 네임스페이스입니다. 전역 변수의 범위도 네임스페이스입니다. 클래스는 네임스페이스이기도 합니다.

이름 없이 네임스페이스를 생성할 수 있습니다. 예:

// @author Subbotin B.P..h" 네임스페이스 ( int a; int b; ) int _tmain(int argc, _TCHAR* argv) ( a = 5; b = 8; printf("\n a = %d\n", a ); printf("\n b = %d\n\n", b); 0을 반환; )

이는 using 네임스페이스 지시문의 사용을 의미합니다. 가능한 이름 충돌을 방지하려면 이러한 네임스페이스가 필요합니다.

네임스페이스 이름이 너무 길면 네임스페이스 별칭을 만들 수 있습니다. 예:

// @author Subbotin B.P..h" 네임스페이스 지하 ( int a; int b; ) 네임스페이스 ug = Underground; int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf ("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); 0을 반환; )

네임스페이스 ug = 지하;

지하 네임스페이스에 대한 별칭 ug를 소개합니다. 다음으로 별칭을 사용하여 작업합니다.

네임스페이스에서 이름 중 일부만 사용하려는 경우 이 부분을 새 네임스페이스로 선택하여 사용할 수 있습니다. 예:

// @author Subbotin B.P..h" 네임스페이스 Underground ( int a; int b; int c; float d; double e; ) 네임스페이스 ug ( usingground::a; usingground::b; ) int _tmain(int argc, _TCHAR* argv) ( ug::a = 5; ug::b = 8; printf("\n ug::a = %d\n", ug::a); printf("\n ug::b = %d\n\n", ug::b); 0을 반환; )

여기서는 지하 네임스페이스의 5개 변수 중 2개만 사용한다고 가정합니다. 두 개의 using 선언이 포함된 새 네임스페이스 ug를 만듭니다. 다음으로 ug 네임스페이스를 사용하여 작업합니다.

네임스페이스는 변경될 수 있습니다. 그것에 새로운 광고를 추가하십시오. 예:

// @author Subbotin B.P..h" 네임스페이스 지하( int a; int b; ) 네임스페이스 지하( float c; ) int _tmain(int argc, _TCHAR* argv) ( 지하::a = 5; 지하::b = 8 ; 지하::c = 1.2; printf("\n 지하::a = %d\n", 지하::a); printf("\n 지하::b = %d\n", 지하::b ); printf("\n 지하::c = %.1f\n\n", 지하::c); return 0; )

우리는 다음을 얻습니다:

네임스페이스는 중첩될 수 있습니다. 예:

// @author Subbotin B.P..h" 네임스페이스 upper ( int a; int b; 네임스페이스 inner ( float c; ) ) int _tmain(int argc, _TCHAR* argv) ( upper::a = 5; upper::b = 8 ; 상부::inner::c = 1.2; printf("\n 상부::a = %d\n", 상부::a); printf("\n 상부::b = %d\n", 상부 ::b); printf("\n upper::inner::c = %.1f\n\n", upper::inner::c); return 0; )

우리는 다음을 얻습니다:

이 예에서는 upper 네임스페이스에 inner 네임스페이스가 포함되어 있습니다. 내부 네임스페이스 필드에 액세스하는 방법을 확인하세요.

상부::내부::c = 1.2;

전역 네임스페이스를 살펴보겠습니다. 여기서 연산자::는 공간 이름을 지정하지 않고 사용됩니다. 전역 네임스페이스에는 해당하는 using 지시문을 포함한 전역 선언이 포함되어 있습니다. 전역 네임스페이스의 예:

// @author Subbotin B.P..h" #include 네임스페이스 std 사용; int nVar; int _tmain(int argc, _TCHAR* argv) ( int nAnotherVar = 1; ::nVar = 5; cout<<"\n nAnotherVar = "<

선언 사용과 지시문 사용의 차이점을 확인하는 것이 중요합니다.
using 선언은 로컬 범위에서 변수를 사용할 수 있게 만듭니다. 로컬 이름 선언이 발생합니다. 지역 변수를 선언하는 방법에는 일반 또는 using 선언을 사용하는 두 가지 방법이 있습니다.

using 지시문은 지정된 네임스페이스의 모든 이름을 사용할 수 있게 해주지만 로컬로 선언하지는 않습니다.

using 선언은 using 지시문보다 우선합니다.

예를 살펴보겠습니다:

// @author Subbotin B.P..h" 네임스페이스 sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; 네임스페이스 sbp 사용; a = 1; sbp:: a = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::a = %d\n", sbp::a); printf(" \n::a = %d\n\n", ::a); 0을 반환; )

우리는 다음을 얻습니다:

네임스페이스 sbp 사용;

이는 sbp 네임스페이스의 모든 이름을 사용 가능하게 만드는 using 지시문입니다.

이것은 지역 변수 a를 사용하여 작업하고 있습니다. 공간 sbp에서 변수 a에 값을 할당하려면 명시적으로 sbp를 가리켜야 합니다.

전역 변수 a에도 동일하게 적용됩니다.

지역 변수 a는 같은 이름을 가진 전역 변수를 닫습니다.

이제 using 선언의 예는 다음과 같습니다.

// @author Subbotin B.P..h" 네임스페이스 sbp ( int a; int b; int c; ) int a; int _tmain(int argc, _TCHAR* argv) ( int a; a = 1; sbp::b 사용; b = 2; ::a = 3; printf("\n a = %d\n", a); printf("\n sbp::b = %d\n", sbp::b); printf("\ n::a = %d\n\n", ::a); 0을 반환; )

우리는 다음을 얻습니다:

이는 사용 선언입니다. 여기서 변수 b는 sbp 네임스페이스에서 로컬로 선언됩니다. 이 공지가 나온 후 다음 조치를 취할 수 있습니다.

하지만 a에 대한 using 선언은

예제에서는 지역 변수 a가 이미 정의되어 있기 때문에 오류가 발생합니다.

이전 예제에서 개발한 Array 클래스를 공유하고 싶다고 가정해 보겠습니다. 그러나 이 문제를 다루는 데 있어서 우리는 혼자가 아니었습니다. 아마도 Intel 부서 중 한 곳의 누군가가 같은 이름의 클래스를 만들었을 것입니다. 이들 클래스의 이름이 동일하기 때문에 잠재적 사용자는 두 클래스를 동시에 사용할 수 없으며 둘 중 하나를 선택해야 합니다. 이 문제는 클래스 이름에 개발자를 식별하는 문자열을 추가하여 해결됩니다.

클래스 Cplusplus_Primer_Third_Edition_Array( ... );

물론 이것이 이름의 고유성을 보장하는 것은 아니지만 사용자를 이 문제로부터 구할 가능성이 높습니다. 그러나 그렇게 긴 이름을 사용하는 것은 얼마나 불편한 일인가!
C++ 표준은 이름 일치 문제를 해결하기 위한 메커니즘을 제공합니다. 네임스페이스. 각 소프트웨어 제조업체는 자체 네임스페이스에 클래스, 함수 및 기타 개체를 래핑할 수 있습니다. 예를 들어 Array 클래스의 선언은 다음과 같습니다.

네임스페이스 Cplusplus_Primer_3E(템플릿 클래스 배열(...); )

네임스페이스 키워드는 클래스의 가시성을 정의하는 네임스페이스(이 경우 Cplusplus_Primer_3E)를 지정합니다. 다른 개발자의 클래스가 다른 네임스페이스에 배치되어 있다고 가정해 보겠습니다.

네임스페이스 IBM_Canada_Laboratory(템플릿 클래스 배열(...);
클래스 매트릭스(...);
}
네임스페이스 Disney_Feature_Animation(
클래스 포인트(...);
주형 클래스 배열(...);
}

기본적으로 명시적인 네임스페이스 없이 선언된 개체는 프로그램에 표시됩니다. 그들은 속해있다 글로벌네임스페이스. 다른 공간의 개체를 참조하려면 범위 확인 연산자(::)로 구분된 네임스페이스 식별자와 개체 식별자로 구성된 정규화된 이름을 사용해야 합니다. 위 예제의 개체에 대한 호출은 다음과 같습니다.

Cplusplus_Primer_3E::배열 텍스트; IBM_Canada_Laboratory::Matrix 매트; Disney_Feature_Animation::점 원점(5000,5000);

사용 편의성을 위해 네임스페이스에 별칭을 할당할 수 있습니다. 닉네임은 짧고 기억하기 쉽도록 선택되었습니다. 예를 들어:

// 별칭 네임스페이스 LIB = IBM_Canada_Laboratory; 네임스페이스 DFA = Disney_Feature_Animation;
정수 메인()
{
LIB::배열 ia(1024);
}

별칭은 네임스페이스 사용을 숨기는 데에도 사용됩니다. 별칭을 대체함으로써 관련된 함수 및 클래스 세트를 변경할 수 있으며 다른 모든 측면에서 프로그램 코드는 동일하게 유지됩니다. 위 예에서 한 줄만 수정하면 완전히 다른 배열의 정의를 얻을 수 있습니다.

네임스페이스 LIB = Cplusplus_Primer_3E; int main() ( LIB::배열 ia(1024); )

물론 이것이 가능하려면 클래스 인터페이스와 이러한 네임스페이스에 선언된 함수가 정확히 일치해야 합니다. Disney_Feature_Animation의 Array 클래스에 크기라는 매개변수가 하나인 생성자가 없다고 가정해 보겠습니다. 그러면 다음 코드에서 오류가 발생합니다.

네임스페이스 LIB = Disney_Feature_Animation;
정수 메인()
{
LIB::배열 ia(1024);
}

훨씬 더 편리한 방법은 일부 네임스페이스에 정의된 객체를 참조하기 위해 단순하고 한정되지 않은 이름을 사용하는 것입니다. 이에 대한 using 지시문이 있습니다.
#include "IBM_Canada_Laboratory.h"

네임스페이스 IBM_Canada_Laboratory를 사용합니다.
정수 메인()
{
매트릭스 매트(4,4);
// IBM_Canada_Laboratory::Array
정렬 ia(1024);
// ...
}

IBM_Canada_Laboratory 네임스페이스가 프로그램에 표시됩니다. 전체 공간이 아니라 그 안에 있는 개별 이름을 표시할 수 있습니다(지시문을 사용하여 선택적).

#include "IBM_Canada_Laboratory.h" IBM_Canada_Laboratory::Matrix 네임스페이스를 사용;
// Matrix만 표시됩니다.
정수 메인()
{
// IBM_Canada_Laboratory::Matrix
매트릭스 매트(4,4); // 오류: IBM_Canada_Laboratory::Array가 보이지 않습니다.
정렬 ia(1024);
// ... }

이미 언급했듯이 C++ 표준 라이브러리의 모든 구성 요소는 std 네임스페이스 내에 선언됩니다. 따라서 표준 함수와 클래스를 직접 사용하기 위해서는 단순히 헤더 파일을 포함하는 것만으로는 충분하지 않습니다.

#포함하다 // 오류: 문자열이 보이지 않습니다.

using 지시문을 사용해야 합니다.

#포함하다 네임스페이스 std 사용; // 확인: 문자열을 참조하세요.
string current_chapter = "C++ 검토";

그러나 이러한 방식으로 전역 네임스페이스를 "막히는" 문제로 돌아가서 명명된 공간의 메커니즘이 생성된 문제를 해결합니다. 따라서 정규화된 이름을 사용하는 것이 더 좋습니다.

#포함하다 // 정확함: 정규화된 이름 std::string current_chapter = "C++ 개요"; 또는 다음을 사용하는 선택적 지시어: #include 네임스페이스 std::string 사용; // 확인: 문자열 표시
string current_chapter = "C++ 검토";

후자의 방법을 사용하는 것이 좋습니다.
이 책의 대부분의 예제에서는 네임스페이스 지시문이 생략되었습니다. 이는 코드 크기를 줄이기 위해 수행되었으며, 또한 대부분의 예제가 네임스페이스를 지원하지 않는 컴파일러로 컴파일되었기 때문에 C++의 최근 혁신으로 충분합니다. (C++ 표준 라이브러리로 작업할 때 using 선언을 사용하는 방법에 대한 자세한 내용은 섹션 8.6에서 설명합니다.)
다음 장에서는 String, Stack, List 및 Stack의 변형이라는 네 가지 클래스를 더 만듭니다. 이들 모두는 Cplusplus_Primer_3E라는 하나의 네임스페이스에 포함됩니다. (네임스페이스 작업에 대한 자세한 내용은 8장에서 설명합니다.)

연습 2.21

지정된 네임스페이스

네임스페이스 Exercize(템플릿 클래스 배열(...);
주형
무효 인쇄(배열< EType >);
클래스 문자열( ... )
주형
클래스 목록(...);
}

그리고 프로그램 텍스트:

Int main() ( const int size = 1024; 배열 순회 재판); 목록 il(크기);
// ...
정렬 *pas = 새 어레이 (처럼);
목록 *pil = 새 목록 (일);
print(*pas);
}

사용된 클래스의 선언이 연습 네임스페이스에 포함되어 있으므로 프로그램이 컴파일되지 않습니다. 다음을 사용하여 프로그램 코드를 수정합니다.
(a) 한정된 이름
(b) 선택적 사용 지시어
(c) 별칭 메커니즘
(d) 지시어 사용