네임스페이스 – 02.네임스페이스의 필요성

PHP의 네임스페이스는 클래스 또는 함수와 같은 재사용 가능한 코드 요소code element를 만들 때 라이브러리 및 애플리케이션 작성자가 직면하는 두 가지 문제를 해결하도록 설계되었습니다.

  1. (이름 충돌 방지) 사용자가 작성한 코드와 PHP 내장 클래스/함수/상수 또는 다른 개발자가 작성한 클래스/함수/상수 간의 이름 충돌name collision을 방지합니다.
  2. (긴 이름 단축) 매우 긴 이름extra long name에 대한 별칭(또는 단축) 기능은 이름 충돌 방지에서 나타나는 문제를 다소 해결하여 소스 코드의 가독성을 향상 시킵니다.

이름 충돌 방지

네임스페이스는 내가 작성한 코드, PHP 내장 클래스/함수/상수 또는 다른 개발자가 배포한 클래스/함수/상수 간의 이름 충돌을 피하도록 설계되었습니다.

2008년 당시에는 PHP로 프로그래밍할 때 보통 일인체제하에 소규모로 만들어지는 경우가 많다 보니 함수나 클래스의 이름이 중복되어 충돌되는 것을 쉽게(?) 피할 수 있었습니다. 그러나 PHP도 여러 사람이 공동 작업하는 경우도 많게 되고 제작되는 프로그램 덩치도 커지고 복잡해지다보니 이름의 중복으로 발생하는 충돌을 피하기가 쉽지 않게 되었습니다.

이러한 이유로 PHP 6*를 개발할 당시에는 처음부터 네임스페이스를 지원하도록 설계/제작되고 있었습니다. 이러한 와중에 그동안의 알려진 바와 같이 PHP 5.3에 네임스페이스 기능이 이식되어 2008년 8월 1일에 PHP 5.3 알파1 버전으로 정식으로 공개되었습니다.

* PHP 5의 차기 버전으로 개발 중이던 PHP 6은 내부적인 문제가 발생하여 개발이 중단되었으며, PHP 6에 포함되었던 기능들 중 일부가 PHP 5에 흡수되어 사용되다가 PHP 6을 건너뛰고 PHP 7로 넘어갑니다.

객체지향언어 중에는 네임스페이스를 지원하지 않는 언어도 있는 이유로 혹자는 네임스페이스가 꼭 필요한 것이냐고 반문하는 분도 계시지만 네임스페이스가 객체화 도구가 아니고 모듈화 도구이기 때문에 객체지향언어와 무관하게 좀 더 개선된 모듈화 프로그래밍을 할 수 있는 좋은 도구라고 이해하면 될 것 같습니다.

사실 클래스를 이용하면 네임스페이스 지원 없이도 함수/상수의 이름 중복으로 발생하는 충돌을 잘 피할 수 있습니다. 그러나 클래스 이름의 경우는 그렇지 않습니다. PHP 5 버전이 공개되면서 새로 개발되는 거의 대부분의 PHP 코드들이 클래스를 이용하게 된 현실로 볼 때 모듈화 도구로서 자연스럽게 네임스페이스를 지원하게 된 것 같습니다.

“클래스를 사용해야하나?”라는 문서를 통해 모듈화에서 네임스페이스의 역할에 대하여 설명드렸던 것처럼 갈수록 점점 복잡해지고 덩치가 커져가는 PHP 라이브러리와 같은 프로그램에서 함수나 클래스 등의 이름 충돌 문제를 자주 접하게 됩니다. 그동안 대부분의 프로그래머들은 이러한 문제를 피하기 위하여 이름 앞에 해당 프로그램의 특징을 나타내는 접두어를 붙이는 방법을 주로 사용하여 왔으나 이러한 방법은 이름의 길이를 길게 만들기 때문에 소스를 복잡하게 만드는 등 좋지 않은 요인으로 작용하였습니다.

예를 들어 후키템플릿 라이브러리에서 정의된 클래스 이름을 보면 아래와 같이 대부분의 클래스 이름에는 접두어로 hTemplate가 붙습니다. 이것은 다른 라이브러리 등과 함께 사용할 때 이름이 충돌되는 것을 피하기 위한 한 방편으로 사용된 것입니다.

만약 PHP 5.3.0 버전부터 제공되는 namespace 키워드를 이용한다면 아래와 같이 클래스 이름에 접두어 hTemplate를 붙이지 않더라도 다른 프로그램과 이름이 충돌하는 것을 피할 수 있을 것입니다.

또 다른 예로 PEAR의 HTTTP 패키지를 살펴보면 아래와 같은 “HTTP”, HTTP_Downlod, HTTP_Request와 같은 특정 접두어를 붙인 클래스 이름을 사용하여 클래스 이름이 다름 프로그램과 충돌될 가능성을 사전에 피하려고 한 것을 볼 수 있습니다.

  • HTTP_Download
  • HTTP_Client
  • HTTP_Header
  • HTTP_Request
  • HTTP_Download_PgLOB
  • HTTP_Download_Archive
  • HTTP_Header_Cache
  • HTTP_Request_Listener

PEAR2 Coding Standards Rule을 보면 PEAR2의 모든 클래스와 함수는 아래와 같이 반드시 PEAR2의 네임스페이스를 정의하도록 하고 있습니다. (아래의 세 번째 예는 설명을 위해 추가하였음)

이와 같이 네임스페이스를 이용하면 클래스 이름에 더 이상 접두어를 붙일 필요없이 간략화된 클래스 이름을 사용할 수 있습니다.

  • Download
  • Client
  • Header
  • Request
  • PgLOB
  • Archive
  • Cache
  • Listener

이와 같이 네임스페이스의 지원으로 간단명료한 클래스 이름을 사용하여 프로그래밍할 수 있게 되었으며 단지 각 클래스들이 어느 네임스페이스에 속해 있는지만 명확히 지정해주면 됩니다.

긴 이름 단축

위에서 살펴본 바와 같이 클래스/함수/상수를 정의할 때 namespace 키워드로 네임스페이스를 지정하게 되면, 해당 클래스/함수/상수 이름들이 지정된 네임스페이스로 캡슐화되어  PHP 내장 또는 다른 프로그램에서 사용 중인 클래스/함수/상수 이름과 관계없이 고유한 이름을 사용할 수 있습니다. 따라서 불필요한 접두어를 생략하고, 이미 사용되고 있을 법한 DB, Cache, File, Download, Header, Request, Assign, Connect 등과 같은 짧은 이름의 클래스/함수/상수를 자유롭게 정의하여 사용할 수 있습니다.

그럼에도 불구하고 네임스페이스로 캡슐화된 클래스/함수/상수 이름에 접근하기 위해서는 상황에 따라 복잡한 네임스페이스 계층hierarchy을 통해야 하는 경우도 자주 발생하게 됩니다.

이러한 복잡한 네임스페이스 계층hierarchy을 use 문을 이용하면 짧은 이름으로 접근할 수 있습니다.

use 문에 as 연산자를 이용하면 매우 긴 이름의 네임스페이스 대신에 더 짧은 이름의 별칭으로 임포트import할 수 있기 때문에 소스 코드의 가독성을 향상 시킬 수 있습니다.

답글 남기기