이름공간
1. 개요
이름공간은 식별자(이름)의 논리적 그룹을 담기 위한 추상적인 컨테이너 또는 환경으로, 컴퓨터 프로그래밍 및 다양한 분야에서 사용되는 개념이다. 이름공간은 이름 충돌을 방지하고 코드의 모듈성을 높이는 데 기여하며, 프로그래밍 언어에서는 식별자에 문맥을 제공한다. 계층적 이름공간은 이름을 하위 위임할 수 있는 명명 체계로, 도메인 이름 시스템(DNS)과 Uniform Resource Name(URN) 등이 그 예시이다. 프로그래밍 외에도 이메일 주소, URI, XML 등에서 이름공간과 유사한 개념이 활용된다.
2. 네이밍 시스템
이름공간의 이름은 이름공간 식별자와 로컬 이름으로 구성되며, 일반적으로 로컬 이름에 대한 접두사로 적용된다.
ABNF 형식으로는 다음과 같이 나타낸다.
:
지역 이름이 단독으로 사용될 때는 이름 해석을 사용하여 특정 지역 이름이 어떤 이름을 지칭하는지 결정한다.
이러한 이름공간과 그에 수반되는 개념은 프로그래밍 언어에 국한되지 않고 활용된다. 예를 들어, 이메일 주소나 URI도 이름공간과 동일한 논리로 구성되어 있으며, 이러한 명명 체계를 통해 이름을 구분하고 분류하는 것을 넓은 의미에서 이름공간이라고 부르기도 한다.
* URI의 스키마 이름공간은 IANA가 관리한다.
* XML의 이름공간은 요소명 등이 중복되지 않도록 정리된 공간이다. xmlns 속성 등으로 이름공간을 선언한다. 예를 들어, "
* 위키백과를 포함한 MediaWiki 사용 사이트에서는 Help:이름공간과 같은 페이지 종류를 구분하는 이름공간 목록이 있다. 예를 들어 "Help:이름공간"이라는 항목명에서 "Help"가 이름공간이고 "이름공간"이 이름이다.
2.1. 예시
이름공간의 예시는 다음과 같다.
| 상황 | 이름 | 이름공간 식별자 | 로컬 이름 |
|---|---|---|---|
| 경로 | /home/user/readme.txt | /home/user (디렉토리) | readme.txt (파일명) |
| 도메인 이름 | www.example.com | example.com (도메인 이름) | www (리프 도메인 이름) |
| C++ | std::array | std (C++ 이름공간) | array (구조체) |
| UN/LOCODE | US NYC | US (국가 또는 영토) | NYC (지역) |
| XML | xmlns:xhtml="http://www.w3.org/1999/xhtml" <xhtml:body> | xhtml (이전에 선언된 XML 이름공간 xhtml="http://www.w3.org/1999/xhtml") | body (요소) |
| Perl | $DBI::errstr | $DBI (Perl 모듈) | errstr (변수) |
| Java | java.util.Date | java.util (Java 이름공간) | Date (클래스) |
| URN(Uniform Resource Name, 통일 자원 이름) | urn:nbn:fi-fe19991055 | urn:nbn (국가 서지 번호) | fi-fe19991055 |
| 핸들 시스템 | 10.1000/182 | 10 (핸들 명명 권한) | 1000/182 (핸들 지역 이름) |
| 디지털 객체 식별자 | 10.1000/182 | 10.1000 (게시자) | 182 (출판물) |
| MAC 주소 | 01-23-45-67-89-ab | 01-23-45 (조직 고유 식별자) | 67-89-ab (NIC 특정) |
| PCI ID | 1234 abcd | 1234 (벤더 ID) | abcd (장치 ID) |
| USB VID/PID | 2341 003f | 2341 (벤더 ID) | 003f (제품 ID) |
| SPARQL | dbr:Sydney | dbr (이전에 선언된 온톨로지, 예를 들어 @prefix dbr: | Sydney |
예를 들어 "이치로"라는 이름은 일본 전역에 여러 명이 있을 수 있어서 한 사람으로 특정할 수 없다. 이처럼 같은 이름을 가진 사람이 여럿이라 구분이 안 되는 것을 이름 충돌이라고 한다. 하지만 "스즈키 이치로"와 같이 전체 이름으로 부르면 다른 "사토 이치로", "야마모토 이치로"와 구별할 수 있다. 이때 "이치로"는 단순 이름, "스즈키 이치로"는 완전 한정명이라고 한다. "이치로"는 "스즈키"라는 이름 공간에 속한다고 볼 수 있다.
같은 "스즈키"라는 성씨를 쓰는 스즈키 가족 안에서는 "이치로"라고 하면 보통 "스즈키 이치로"를 뜻하므로, 굳이 "스즈키 이치로"라고 부를 필요가 없다. 또 "'이치로'는 '스즈키 이치로'를 의미한다"라고 미리 정해두면, 나중에 "이치로"라고만 해도 "스즈키 이치로"로 이해할 수 있다. 필요하다면 "일본 도쿄도 세타가야구 ○초메 ○○ 스즈키 이치로"처럼 더 자세하게 부를 수도 있다.
3. 이름 충돌
서로 다른 XML 애플리케이션의 XML 문서를 혼합하려는 경우 이름 충돌이 발생할 수 있다. 요소 이름은 개발자가 정의하기 때문에, 서로 다른 XML 문서를 혼합할 때 충돌을 일으키는 경우가 많다.
아래의 예시를 보자.
```xml
| 사과 | 오렌지 |
```
위 XML은 HTML 표 정보를 담고 있다.
```xml
```
위 XML은 탁자 (즉, 가구)에 대한 정보를 담고 있다.
이러한 XML 조각을 함께 추가하면 이름 충돌이 발생한다. 두 XML 모두 `
| 레지스트리 | 등록 기관 | 예시 식별자 | 이름 공간 이름 | 이름 공간 |
|---|---|---|---|---|
| URN | IANA | urn:isbn:978-3-16-148410-0 | urn | 공식 URN 이름 공간 |
| 공식 URN 이름 공간 | IANA | urn:isbn:978-3-16-148410-0 | ISBN | Uniform Resource Names로의 국제 표준 도서 번호 |
| International Article Number (EAN) | GS1 | 978-3-16-148410-0 | 978 | Bookland |
| ISBN | 국제 ISBN 기구 | 3-16-148410-X | 3 | 독일어 사용 국가 |
| 독일 출판사 코드 | [http://www.german-isbn.de/ Agentur für Buchmarktstandards] | 16 | Mohr Siebeck |
6. 이름공간과 범위(Scope)
이름공간은 이름에 문맥(범위)을 제공할 수 있으며, 이러한 용어는 때때로 상호 교환적으로 사용되기도 한다. 그러나 이름의 문맥은 이름이 나타나는 위치나 이름의 구문 등 다른 요인에 의해서도 제공될 수 있다.
| 이름공간 없음 | 이름공간 있음 | |
|---|---|---|
| 지역적 범위 | 자동차 번호판 | 파일 시스템 계층 구조 표준 |
| 전역적 범위 | 범용 고유 식별자 | 도메인 이름 시스템 |
동일한 스코프에 다른 종류의 구문 요소로 같은 이름(식별자)이 나타나는 경우, 문맥으로 구별하는 언어도 있다. 예를 들어 Java에서는 같은 이름을 가진 메서드(함수)와 필드(변수)를 선언할 수 있지만, 메서드 호출과 변수 대입은 구문으로 구별할 수 있다. 그러나 이러한 명명은 코드 가독성과 유지보수성을 해치므로 일반적으로 피해야 한다.
하나의 이름 공간 안에서 동일한 이름의 타입, 변수, 함수를 여러 개 정의하면 문제가 발생한다. 특히 여러 팀에서 개발을 진행하는 경우 이름 충돌이 일어나기 쉽다. 이 경우, 이름공간을 사용하여 각 팀이 자유롭게 이름을 붙이도록 하고, 이름 충돌을 방지할 수 있다. `using namespace` 지시어를 사용하면, 이름 공간 내의 식별자를 가져와서 수식되지 않은 단순명을 사용할 수 있다.
7. 프로그래밍 외 이름공간
프로그래밍 언어 외에도 다양한 분야에서 이름공간 개념이 활용된다.
예를 들어, "이치로"라는 이름은 일본 전역에 여러 명이 있을 수 있어 한 사람으로 특정하기 어렵다. 이처럼 같은 이름을 가진 사람이 여럿 존재하여 구분이 불가능한 상태를 이름 충돌이라고 한다. 하지만 "스즈키 이치로"와 같이 성과 이름을 함께 부르면 다른 "사토 이치로"나 "야마모토 이치로"와 구별할 수 있어 이름 충돌을 피할 수 있다. 이때 "이치로"는 단순 이름, "스즈키 이치로"는 완전 한정 이름이라고 할 수 있다. "이치로"라는 이름은 "스즈키"라는 성씨의 이름 공간에 속한다고 볼 수 있다.
이러한 이름공간 개념은 프로그래밍 언어뿐만 아니라 이메일 주소나 URI와 같은 곳에서도 활용된다.
* URI의 스키마 이름공간은 IANA가 관리한다.
* XML의 이름공간은 요소 이름 등이 중복되지 않도록 정리된 공간이다. 예를 들어, `
* 위키백과를 포함한 MediaWiki 사용 사이트에서는 페이지 종류를 구분하는 이름공간 목록이 있다. 예를 들어 "Help:이름공간"이라는 항목명에서 "Help"가 이름공간이고 "이름공간"이 이름이다.