c에서 네임스페이스란 무엇입니까? 클래스 및 네임스페이스. 네임스페이스에서 코드 호출

클래스와 네임스페이스

.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++로 작업하는 경우 지식을 활용하는 것이 필요합니다.

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

이전 예제에서 개발한 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) 지시어 사용

주석: 이 섹션에서는 네임스페이스의 사용 및 선언에 대해 설명합니다. RDF, XML-Data, DCD(Document Content Description), SOX(Object-Oriented XML) 스키마, DDML(구 XSchema)의 주요 특징이 나와 있습니다.

우리는 이전에 DTD 정의의 몇 가지 단점을 설명했는데, 그 단점은 다음과 같습니다.

  1. 이러한 정의의 구문은 XML의 구문과 다릅니다(특히 소위 확장된 Backus-Naur 형식, 확장된 Backus Naur 양식);
  2. 이러한 정의는 표현력이 충분하지 않습니다.
  3. 각 사용자는 자신만의 태그를 만들 수 있으므로 사람들이 동일한 요소 이름을 사용하여 서로 다른 항목을 참조할 가능성이 높습니다. 요소의 의미가 동일하더라도 정의에 따라 가능한 내용이 달라질 수 있습니다. 따라서 특히 동일한 문서에 다양한 종류의 어휘를 혼합하는 경우 요소의 특정 용도를 정의하는 방법이 필요합니다. 이 문제를 해결하기 위해 W3C는 네임스페이스에 있는 요소의 컨텍스트를 정의할 수 있는 XML 네임스페이스라는 사양을 발표했습니다.
  4. 다양한 DTD 정의에 해당하는 다양한 소스의 XML 문서를 결합해야 하는 상황이 있습니다. 예를 들어, 대량의 정보를 설명할 때 개별 DTD가 전체 볼륨을 포괄하기에 충분하지 않거나 이해하기 어려운 경우 이러한 상황이 발생합니다. 이는 또한 비즈니스 파트너의 데이터를 귀하의 데이터와 결합하려고 할 때 전자 상거래 시스템에서 발생합니다. 일부 정보를 표준 형식으로 교환하기 위해 기존 DTD에 설정을 추가해야 하는 경우도 발생할 수 있습니다. 불행하게도 XML 권장 사항은 여러 DTD를 수정하거나 새 DTD를 만들지 않고(외부 참조 사용) 단일 문서에 결합하는 방법을 제공하지 않습니다.

이 장에서는 다음 두 가지 개념을 다룹니다. 네임스페이스및 XML 스키마. 네임스페이스를 사용하면 XML 개발자는 복잡한 문제를 작은 덩어리로 나누고 여러 어휘를 단일 문서에 결합하여 완벽하게 설명할 수 있습니다. 스키마를 사용하여 사전 디자이너는 DTD에서 가능했던 것보다 더 정확한 정의를 생성하고 이를 XML 구문을 사용하여 수행합니다.

이 두 도구는 XML을 사용할 때 발생하는 복잡한 문제를 해결하는 데 도움이 됩니다. 네임스페이스와 스키마를 사용하면 XML 디자이너와 프로그래머는 다음을 수행할 수 있습니다.

  • 복잡한 문제를 해결하기 위해 어휘를 더 잘 구성합니다.
  • 유지하다 강한 타이핑 XML로/에서 변환하는 동안의 데이터
  • DTD에서 가능했던 것보다 더 정확하고 유연하게 어휘를 설명합니다.
  • 파서를 복잡하게 하지 않고도 XML의 사전 규칙을 읽고 해당 정의에 액세스할 수 있습니다.

혼합 사전

사전을 디자인할 때 전역 문제를 여러 구성 요소로 나누는 것이 합리적일 수 있습니다. 이를 위해서는 큰 문제를 여러 어휘로 분할하는 방법이 필요합니다. 그러나 해결해야 할 실제 문제는 단일 문서 본문 내에서 별도의 DTD를 병합하는 것입니다. 예를 들어, DTD 정의 세트가 이미 있고 이를 사용하면 다른 사람들이 이해하는 대로 문제를 설명하기 때문에 작업을 크게 촉진할 수 있는 회사에서 근무하는 경우에도 이 문제가 발생할 수 있습니다. DTD 정의를 재사용하는 것도 종종 유용합니다. 이전에 생성된 DTD 정의의 공통 구성을 사용합니다. 외부 파트너의 소프트웨어와 통신해야 하는 애플리케이션을 개발하는 경우 기존 개념을 재사용하는 것 외에는 선택의 여지가 없습니다. DTD의 기존 정의는 이해하기 위해 말해야 하는 공통 언어를 구성합니다. 개념이 이미 존재하는 경우 해당 개념의 관점에서 이해되도록 노력해야 합니다.

다른 개발자의 DTD에서 유용한 정의를 사용하거나 분할된 DTD를 결합하여 복잡한 문제를 설명하는 문서를 만들 때 문서에서 동일한 이름의 요소를 사용하는 경우 문제가 발생할 위험이 있습니다. 모호함과 이름 충돌.

여러 DTD의 이름 인스턴스를 사용하면 문제가 더욱 악화됩니다. 이 경우, 우리는 DTD 정의가 어떤 요소를 참조하는지 알 수 없습니다. 이러한 잘 구성된 문서의 문제를 모호성이라고 합니다. 또한 문서의 이름에 필요한 경우 유효성 검사, 우리는 애플리케이션을 매우 혼란스럽게 만들 수 있습니다. 이 문제를 이름 충돌이라고 합니다.

네임스페이스

네임스페이스는 두 가지 매우 중요한 방식으로 사용자에게 도움이 될 수 있습니다. 도움을 받으면 다음을 수행할 수 있습니다.

  • 프로그램이 어떤 소스에서 요소나 속성을 가져왔는지 구별할 것이라는 확신을 잃지 않고 두 개 이상의 소스에서 문서를 결합합니다.
  • 가능하다면 사용자 에이전트가 문서 유형 정의(DTD)나 요소 및 속성에 대한 기타 설명과 같은 추가 자료에 액세스할 수 있도록 허용하십시오.

네임스페이스는 XML 문서에서 요소나 속성의 이름으로 사용할 수 있는 특정 값이나 특성의 모음입니다. XML의 네임스페이스는 URI(Uniform Resource Identifier)로 정의됩니다(서버의 DTD 주소를 URI로 사용할 수 있음). 이를 통해 각 네임스페이스는 고유할 수 있습니다.

따라서 다양한 소스의 요소를 결합하는 문서에서 네임스페이스를 효과적으로 사용하려면 다음을 정의해야 합니다.

  • 요소의 사용을 설명하는 URI에 대한 참조입니다.
  • 요소가 어떤 네임스페이스에서 왔는지 이해할 수 있게 해주는 별칭입니다. 이 별칭은 요소 접두사 형식입니다. 예를 들어, 잘 알려지지 않은 Book 요소의 별칭이 Catalog 인 경우 요소는 다음과 같이 호출됩니다. ).

네임스페이스 사용 및 선언

네임스페이스 선언

서로 다른 마크업 언어(XML 구현)에서는 완전히 다른 의미를 갖는 동일한 태그 이름과 해당 속성을 찾을 수 있으므로 어떻게든 이들을 구별할 수 있어야 합니다. 이를 위해 태그 및 속성의 이름에는 콜론으로 이름과 구분되는 짧은 접두사가 제공됩니다. 이름 접두사는 네임스페이스를 정의하는 식별자와 연결됩니다. 접두사가 동일한 식별자와 연결된 모든 태그 및 속성 이름은 이름이 고유해야 하는 단일 네임스페이스를 형성합니다.

우리는 네임스페이스 선언을 볼 때 모든 사람이 이를 인식할 수 있기를 원하므로 이에 대한 특별한 단어를 예약합니다. 네임스페이스 권장 사항에 따라 단어는 xmlns 입니다. 속성 값은 사용할 네임스페이스를 지정하는 URI입니다. 이는 DTD 정의 URL인 경우가 많지만 항상 그럴 필요는 없습니다. 네임스페이스 접두사 및 식별자는 다음과 같이 xmlns 특성에 의해 정의됩니다.

보시다시피 ntb 접두사는 방금 정의되었지만 이미 ntb: 노트북 이름에 사용될 수 있습니다. 앞으로 네임스페이스 http://some.firm.com/2003/ntbml에 할당하려는 태그 및 속성의 이름에는 ntb라는 접두사가 붙습니다. 예:

고렐로보

또한 하나의 태그에 여러 네임스페이스가 나타날 수 있습니다. 다음은 여러 네임스페이스를 혼합하는 예입니다.

book 요소는 카탈로그 네임스페이스에서 가져오고 ISBN 속성은 order 에서 가져옵니다.

예를 들어 접두사가 붙은 이름

확장된, 한정된 또는 한정된 이름(OName.Qualified Name)이라고 합니다. 콜론 뒤에 쓰여진 이름 부분을 이름의 로컬 부분이라고 합니다.

웹 리소스 이름의 명명법은 혼란스러울 수 있습니다. 유니폼 리소스 로케이터 ( URL, URL)은 액세스 프로토콜 및 네트워크 위치 측면에서 리소스를 나타냅니다. 통일자원식별자( 통일 자원 식별자(URI))은 일부 리소스의 고유한 이름입니다. 단순히 네임스페이스를 식별하는 고유한 문자열로 URI를 살펴보세요.

SGML 및 XML의 규칙에 따라 콜론은 일반 문자로 이름에 사용될 수 있으므로 접두사가 있는 이름은 단지 속임수일 뿐입니다. 네임스페이스를 "알지" 못하고 문서를 구문 분석하는 모든 프로그램은 일반 이름과 같은 정규화된 이름입니다. 특히 다음과 같습니다. 문서 유형 선언(문서 유형 선언) 이름 접두어는 생략할 수 없습니다.

xmlns 특성은 루트 요소뿐 아니라 모든 XML 요소에 나타날 수 있습니다. 정의된 접두사는 xmlns 속성이 기록되는 요소와 그 안에 중첩된 모든 요소에서 사용될 수 있습니다. 또한 하나의 요소에 여러 개의 네임스페이스를 정의할 수 있습니다.

중첩된 요소에서는 접두사를 다른 식별자와 연결하여 네임스페이스를 재정의할 수 있습니다.

네임스페이스를 사용하는 문서에서 접두사가 없는 태그 이름이 나타나는 것은 해당 이름이 기본 네임스페이스에 속한다는 것을 의미합니다.

잘 디자인된 문서는 모든 요소에 네임스페이스를 사용해야 합니다.

어떤 경우든 xml 문자로 시작하는 접두사는 XML 언어 자체용으로 예약되어 있습니다. xmlns 접두사는 정의된 다른 접두사를 해당 네임스페이스 식별자와 연결하는 데 사용됩니다. xmlns 접두사는 정의할 필요가 없으며 "XML의 네임스페이스" 권장 사항에 따라 도입되었으며 네임스페이스 식별자와 연결됩니다. http://www.w3.ori/2000 /xmlns/.

또 다른 접두사인 xml은 동일한 권장 사항에서 식별자와 연결됩니다. http://www.w3.org/XML/1998/namespace. 또한 XML 문서에 정의할 필요도 없습니다. 다른 접두사는 이러한 식별자와 연결될 수 없습니다. Preserve는 공백 문자를 그대로 유지하도록 지시합니다. 이는 프로그램 코드와 같은 일부 텍스트에 중요합니다. 기본값은 공백을 핸들러의 재량에 맡깁니다.

범위

네임스페이스 선언에는 프로그래밍 언어의 변수 선언과 마찬가지로 범위가 있습니다. 네임스페이스는 항상 XML 문서의 시작 부분에서 선언되지 않고 때로는 후속 섹션에서 선언되기 때문에 이는 중요합니다. 네임스페이스 선언은 명시적으로 정의되지 않은 경우에도 해당 요소가 나타나는 요소와 해당 요소의 하위 항목에 적용됩니다. 이름은 선언 범위 내에서 사용되는 경우에만 네임스페이스를 참조할 수 있습니다.

그러나 다른 네임스페이스를 상속하는 요소의 네임스페이스 범위도 혼합해야 합니다. 이와 관련하여 범위를 선언하는 두 가지 방법, 즉 기본값과 한정이 정의됩니다.

기본 범위

예상할 수 있듯이 문서의 모든 이름에 접두사를 붙이는 것은 금세 지루해집니다. 실제로 이름 범위 개념을 도입하면 문서에 많은 수의 접두사를 혼합할 수 있습니다. 기본 네임스페이스를 정의하면 선언 범위 내에서 정규화되지 않은 모든 이름을 소유하는 것으로 간주됩니다. 따라서 루트 요소에 선언된 기본 네임스페이스는 전체 문서의 기본값으로 간주되며 문서 내에 선언된 보다 구체적인 네임스페이스에 의해서만 재정의될 수 있습니다.

네임스페이스를 범위의 기본 네임스페이스로 만들려면 접두사 선언을 생략하면 됩니다.

접두사를 선언한 후 이름과 함께 사용하면 네임스페이스가 명시적으로 설정되었다고 합니다. 정규화되지 않은 이름을 네임스페이스에 할당하려면 정규화되지 않은 이름(접두사 없이)을 포함하는 기본 공간을 선언해야 합니다.

적격 범위

위의 방법은 네임스페이스를 명확하게 구분할 수 있는 경우에 효과적입니다. 그러나 때로는 문서에 외부 네임스페이스의 개별 이름을 포함해야 하는 경우도 있습니다. 전체 범위에 대해 네임스페이스를 선언하는 대신 정규화된 이름을 사용할 수 있습니다. 문서 시작 부분에 필요한 네임스페이스를 선언한 다음 사용 시점에 한정하십시오.

도움이 될 것입니다.
PHP에서 네임스페이스 지원을 향한 길은 험난했습니다. 하지만 다행스럽게도 PHP 5.3에서 언어에 추가되었고 그 이후로 PHP 코드 구조가 크게 개선되었습니다. 하지만 정확히 어떻게 사용해야 할까요?

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

"네임스페이스 이름을 문자열로 저장할 때 백슬래시를 잊지 마세요!"

네임스페이스를 연필, 자, 종이 등 무엇이든 넣을 수 있는 상자로 생각하십시오. 이것들은 당신의 것입니다. 당신의 상자 바로 아래에는 다른 사람의 상자가 있는데, 그 주인은 그 안에 똑같은 물건을 보관하고 있습니다. 서로의 물건을 사용하는 것을 피하기 위해 상자에 라벨을 붙여서 무엇이 누구의 것인지 명확하게 하기로 결정했습니다.

이전에는 개발자가 코드를 구분하기 위해 클래스, 함수 및 상수에 밑줄 접두사를 사용해야 했습니다. 이는 모든 사람이 자신의 소지품에 라벨을 붙이고 하나의 큰 상자에 보관하는 것과 같습니다. 물론 이것은 적어도 일종의 조직이지만 매우 비효율적입니다.

네임스페이스, 도와주세요! 치명적인 오류 없이 동일한 함수, 클래스, 인터페이스를 선언하고 별도의 네임스페이스에 상수를 정의할 수 있습니다. 기본적으로 네임스페이스는 일반 PHP 코드를 포함하는 계층적으로 레이블이 지정된 코드 블록에 지나지 않습니다.

당신은 그것을 사용합니다!

네임스페이스를 간접적으로 사용하고 있다는 점을 이해하는 것이 중요합니다. PHP 5.3부터 사용자 정의 네임스페이스에 아직 선언되지 않은 모든 정의는 전역 네임스페이스에 속합니다.

전역 네임스페이스에는 mysqli_connect() 및 Exception 클래스와 같은 모든 PHP 내부 정의도 저장됩니다. 전역 네임스페이스에는 고유한 식별 이름이 없으므로 가장 일반적으로 전역 네임스페이스라고 합니다.

네임스페이스 사용은 선택 사항입니다.
PHP 스크립트는 그것들 없이도 잘 작동할 것이며 이 동작은 곧 바뀌지 않을 것입니다.

네임스페이스 정의

네임스페이스가 포함된 파일은 다른 코드보다 먼저 해당 선언을 포함해야 합니다. 네임스페이스 이전에 선언할 수 있는 유일한 것은 예약어 선언입니다. 선언 표현식은 네임스페이스 선언 앞에 나타나 파일 인코딩을 나타낼 수 있습니다.

네임스페이스는 예약어 네임스페이스를 사용하여 선언됩니다. 네임스페이스는 PHP의 다른 식별자와 동일한 규칙을 따릅니다. 따라서 네임스페이스는 문자나 밑줄로 시작하고 그 뒤에 임의 개수의 문자, 숫자 또는 밑줄이 옵니다..

코드 블록을 전역 공간으로 정의하려는 경우 이름을 추가하지 않고 네임스페이스 키워드를 사용할 수 있습니다.

하나의 파일에서 여러 네임스페이스를 사용할 수 있습니다.

여러 다른 파일에 동일한 네임스페이스를 사용할 수도 있습니다. 파일 연결 프로세스가 자동으로 병합됩니다. 클래스에서와 마찬가지로 네임스페이스 정의 수를 단일 파일로 제한하는 것이 좋은 코딩 방법입니다.

네임스페이스는 일관되지 않은 정의를 방지하고 프로그램 코드에 더 많은 유연성과 구성을 도입하는 데 사용됩니다.

중괄호는 완전히 선택 사항입니다. 실제로 파일당 하나의 네임스페이스 규칙을 사용하고 중괄호를 생략하면 코드가 훨씬 깔끔해집니다. 즉, 중첩된 코드를 들여쓸 필요가 없습니다.

하위 네임스페이스

네임스페이스는 컴퓨터 파일 시스템의 디렉터리처럼 특정 계층 구조를 따를 수 있습니다. 하위 네임스페이스는 프로젝트 구조를 구성하는 데 매우 유용합니다. 예를 들어 프로젝트에 데이터베이스 액세스가 필요한 경우 데이터베이스 예외 처리기 및 연결 처리기 코드를 데이터베이스 네임스페이스 하위 네임스페이스에 배치할 수 있습니다.

유연성을 위해 중첩된 네임스페이스를 하위 디렉터리에 저장하는 것이 좋습니다. 이는 프로젝트를 구조화하는 데 도움이 되며 PSR-4 표준을 따르는 자동 로더에 사용하기가 훨씬 쉬워집니다.

PHP는 백슬래시를 네임스페이스 구분 기호로 사용합니다.

흥미로운 사실: RFC에서는 어떤 네임스페이스 구분 기호를 사용할지 결정하기 위해 이모티콘을 사용하는 옵션이 고려되었습니다.

// myproject/database/connection.php원하는 만큼 중첩된 네임스페이스를 사용할 수 있습니다.

중첩된 코드 블록으로 하위 네임스페이스를 정의하는 것은 지원되지 않습니다. 다음 예에서는 "네임스페이스 선언을 중첩할 수 없습니다."라는 치명적인 오류를 반환합니다.

네임스페이스에서 코드 호출

객체의 새 인스턴스를 생성하거나, 함수를 호출하거나, 다른 네임스페이스의 상수를 사용하려면 백슬래시를 사용합니다. 네임스페이스 이름 정의에는 세 가지 유형이 있습니다.
  • 규정되지 않은 이름
  • 정규화된 이름
  • 정규화된 이름

불완전한 이름

이는 클래스, 함수 또는 상수의 이름이며 네임스페이스에 대한 참조를 포함하지 않습니다. 네임스페이스 작업을 막 시작한 사람들에게는 이것이 일반적인 관점입니다.

성명

이것이 하위 네임스페이스 계층 구조에 액세스하는 방법입니다. 백슬래시로 구분됩니다.

아래 예에서는 MyProject\FileAccess\Input이 현재 있는 네임스페이스와 관련이 없기 때문에 "치명적인 오류: "MyProject\Database\MyProject\FileAccess\Input" 클래스를 찾을 수 없습니다."라는 치명적인 오류를 반환합니다.

절대 이름

현재 속해 있는 네임스페이스와 관련하여 전체 이름과 부분 이름이 사용됩니다. 해당 수준에서 액세스를 정의하거나 네임스페이스 계층 구조를 더 깊이 파고드는 데 사용할 수 있습니다.

계층 구조의 더 높은 수준에 있는 함수, 클래스 또는 상수에 액세스하려면 전체 이름, 즉 상대 경로가 아닌 절대 경로를 사용해야 합니다. 호출은 백슬래시로 시작해야 합니다. 이를 통해 PHP는 이 호출이 현재 위치를 기준으로 액세스하는 것이 아니라 전역 공간에서 이루어져야 함을 알 수 있습니다.

PHP 내부 함수에 전체 이름을 사용할 필요는 없습니다. 함수 및 상수의 정규화되지 않은 이름은 현재 네임스페이스에 정의되지 않은 경우 전역 네임스페이스에 정의됩니다.

이를 알면 이제 원래 함수(또는 상수)를 호출하면서 내부 PHP 함수를 오버로드할 수 있습니다.

"; }

동적 통화

PHP는 동적 프로그래밍 언어입니다. 따라서 이 기능을 사용하여 네임스페이스에서 코드를 호출할 수 있습니다. 이는 동적 클래스 이름을 사용하거나 이름을 저장하는 변수를 사용하여 동적 파일을 연결하는 것과 본질적으로 동일합니다. PHP 이름 구분 기호는 문자열에서 동일한 메타 문자를 사용합니다. 네임스페이스 이름을 문자열로 저장할 때 백슬래시를 잊지 마세요!

네임스페이스 키워드

네임스페이스 키워드는 네임스페이스를 정의하는 데 사용될 뿐만 아니라 클래스의 self 키워드와 기능적으로 유사하게 현재 네임스페이스를 호출하는 데에도 사용할 수 있습니다.

__NAMESPACE__ 상수

현재 클래스의 이름을 정의하는 데 self 키워드를 사용할 수 없는 것처럼, 현재 네임스페이스에는 네임스페이스 키워드를 사용할 수 없습니다. 따라서 우리는 __NAMESPACE__ 상수를 사용합니다.

이 상수는 네임스페이스 학습을 시작할 때 매우 유용합니다. 디버깅에도 매우 유용합니다. 문자열이므로 위에서 설명한 동적 코드 호출과 함께 사용할 수 있습니다.

이름 별칭 가져오기 또는 만들기

네임스페이스에서 사용할 필요는 없습니다.

PHP 네임스페이스의 중요한 기능은 외부 절대 이름을 참조하는 기능입니다. 아호, 또는 수입.

가져오기는 네임스페이스의 매우 유용하고 기본적인 측면입니다. 이를 통해 이름 충돌에 대한 걱정 없이 라이브러리와 같은 외부 패키지를 사용할 수 있습니다. 가져오기는 use 키워드를 사용하여 수행됩니다. 원하는 경우 as 키워드를 사용하여 사용자 정의 별칭을 지정할 수 있습니다.

로 사용

사용 방법

절대 이름은 더 짧은 비규정 이름에 연결될 수 있으므로 사용할 때마다 절대 이름을 쓸 필요가 없습니다. 별칭 생성 또는 가져오기는 상위 네임스페이스 또는 전역 네임스페이스에서 이루어져야 합니다. 메서드나 함수 내에서 이 작업을 수행하는 것은 잘못된 구문입니다.

대안은 다른 이름으로 별칭을 할당하는 것입니다.

Exception과 같은 전역 클래스를 가져올 수도 있습니다. 가져올 때 절대 이름을 쓸 필요는 없습니다.

네임스페이스에 있는 이름의 경우 앞에 백슬래시가 필요하지 않으며 백슬래시가 있는 것도 권장되지 않습니다. 가져온 이름은 절대적이어야 하고 현재 네임스페이스를 기준으로 구문 분석되지 않기 때문입니다.

동적 네임스페이스 호출은 지원되지만 동적 가져오기는 지원되지 않습니다.

결론

네임스페이스는 정의 충돌을 방지하고 프로그램 코드에 더 많은 유연성과 구성을 도입하는 데 사용됩니다. 네임스페이스를 반드시 사용해야 하는 것은 아닙니다. 이 기능은 객체 지향 접근 방식과 함께 사용됩니다. 네임스페이스를 사용하여 (미래) PHP 프로젝트를 한 단계 더 발전시키는 것을 고려해 보시길 바랍니다.