phpclass/객체정보2008. 8. 9. 12:32
작성: 2008.08.09
네임스페이스의 필요성
PHP로 프로그래밍할 때 보통 일인체제하에 소규모로 만들어지는 경우가 많다 보니 함수명, 클래스명과 같은 이름이 중복되어 충돌되는 것을 쉽게(?) 피할 수 있었습니다. 그러나 이제 PHP도 여러 사람이 공동 작업하는 경우도 많게 되고 제작되는 프로그램 덩치도 커지고 복잡해지다보니 이름의 중복으로 발생하는 충돌을 피하기가 쉽지 않게 되었습니다.
이러한 이유로 PHP의 미래 버전인 v6에서는 처음부터 네임스페이스를 지원하도록 설계/제작되고 있습니다. 이러한 와중에 그동안의 알려진 바와 같이 php v5.3에 네임스페이스 기능이 이식되어 2008년 8월 1일에 php 5.3 알파1 버전으로 정식으로 공개되었습니다.
객체지향언어 중에는 네임스페이스를 지원하지 않는 언어도 있는 이유로 혹자는 네임스페이스가 꼭 필요한 것이냐고 반문하는 분도 계시지만 네임스페이스가 객체화 도구가 아니고 모듈화 도구이기 때문에 객체지향언어와 무관하게 좀 더 개선된 모듈화 프로그래밍을 할 수 있는 좋은 도구라고 이해하면 될 것 같습니다.
사실 클래스를 이용하면 네임스페이스 지원없이도 함수명, 변수명, 상수명 등의 중복으로 발생하는 충돌을 잘 피할 수 있습니다. 그러나 클래스명의 경우는 그렇지 않습니다. PHP v5 버전이 공개되면서 새로 개발되는 거의 대부분의 PHP 코드들이 클래스를 이용하게 된 현실로 볼 때 모듈화 도구로서 자연스럽게 네임스페이스을 지원하게 된 것 같습니다.
"클래스를 사용해야하나?"라는 문서를 통해 모듈화에서 네임스페이스(namespace; 이름공간)의 역할에 대하여 설명드렸던 것처럼 갈수록 점점 복잡해지고 덩치가 커져가는 PHP 라이브러리와 같은 프로그램에서 함수명, 클래스명, 변수명 등의 이름 충돌 문제를 자주 접하게 됩니다. 그동안 대부분의 프로그래머들은 이러한 문제를 피하기 위하여 이름 앞에 해당 프로그램의 특징을 나타내는 접두어를 붙이는 방법을 주로 사용하여 왔으나 이러한 방법은 이름의 길이를 길게 만들기 때문에 소스를 복잡하게 만드는 등 좋지않은 요인으로 작용하였습니다.
예를 들어 후키템플릿 라이브러리에서 정의된 클래스명을 보면 아래와 같이 대부분의 클래스명에는 접두어로 hTemplate가 붙습니다. 이것은 다른 라이브러이 등과 함께 사용할 때 이름이 충돌되는 것을 피하기 위한 한 방편으로 사용된 것입니다.
[code php;gutter:false] <?php class hTemplateCache { /* code */ } class hTemplateCompile { /* code */ } class hTemplateDebug { /* code */ } class hTemplateFile { /* code */ } class hTemplateFilter { /* code */ } class hTemplateFunction { /* code */ } class hTemplateStructure { /* code */ } class hTemplateAssign { /* code */ } class hTemplate extends hTemplateAssign { /* code */ } $tpl = new hTemplate(); ?> [/code]
만약 PHP 5.3.0 버전부터 제공되는 namespace 키워드를 이용한다면 아래와 같이 클래스명에 접두어 hTemplate를 붙이지 않더라도 다른 프로그램과 이름이 충돌하는 것을 피할 수 있을 것입니다.
[code php;gutter:false] <?php namespace hTemplate; class Cache { /* code */ } class Compile { /* code */ } class Debug { /* code */ } class File { /* code */ } class Filter { /* code */ } class Function { /* code */ } class Structure { /* code */ } class Assign { /* code */ } class main extends Assign { /* code */ } $tpl = new hTemplate::main(); ?> [/code]
또 다른 예로 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
< PEAR HTTP 패키지에서 사용된 클래스명 >
PEAR2 Coding Standards(pear.php.net/manual/en/pear2cs.php)의 Rule을 보면 PEAR2의 모든 클래스와 함수는 아래와 같이 반드시 PEAR2의 네임스페이스를 정의하도록 하고 있습니다. (아래의 세번째 예는 설명을 위해 추가하였음)
[code php;gutter:false] <?php namespace PEAR2; class MyClass { /* code */ } ?> [/code]
[code php;gutter:false] <? namespace PEAR2::HTTP; class Request { /* code */ } ?> [/code]
[code php;gutter:false] <? namespace PEAR2::HTTP::Request; class Listener { /* code */ } ?> [/code]
이와 같이 네임스페이스를 이용하면 클래스명에 더 이상 접두어를 붙일 필요가 없습니다.
Download
Client
Header
Request
PgLOB
Archive
Cache
Listener
< 네임스페이스 지원으로 간략화된 클래스명 >
이와 같이 네임스페이스의 지원으로 간단명료한 클래스명을 사용하여 프로그래밍할 수 있게 되었으며 단지 각 클래스들이 어느 네임스페이스에 속해 있는지만 명확히 지정해주면 됩니다.

Posted by 방글24