[PHP5.3.0] Namespaces(네임스페이스)
- Wednesday, July 29, 2009, 19:01
- Articles, Featured, PHP
- 136 views
- Add a comment
PHP 5.3.0 에서는 아주 반가운 기능이 추가되었습니다. PHP는 버전 5로 올라오면서 본격적으로 OOP를 지원하고 있습니다. 이제는 클래스로 기능을 묶는 것이 일반화되었습니다. 그럼에도 불구하고 PHP에서는 왠지 부족함이 느껴졌습니다. 바로 네임스페이스가 없었습니다. 이 네임스페이스가 드디어 5.3.0 버전에서 추가되었습니다.
네임스페이스가 왜 필요한가
네임스페이스는 코드를 묶는 추상적인 개념으로 클래스를 파일이라고 한다면 네임스페이스는 디렉터리라고 할 수 있습니다. 클래스는 비슷한 기능을 하는 함수들을 하나로 묶어 놓은 것입니다. 예를 들면 class DB 에는 select(), insert(), delete(), update() 등 함수가 있을 수 있습니다. 네임스페이스는 DB 클래스가 어디에 속했는 지를 나타냅니다. 자바에는 package 라는 네임스페이스가 있습니다.
PHP에서 클래스를 작성하다 보면 클래스 이름이 중복되어 곤란한 경우가 있습니다. PEAR 에는 DB 클래스가 있습니다. 그런데 Zeroboard XE 의 라이브러리에도 DB 클래스가 있습니다. 만약 PEAR 와 Zeroboard XE를 같이 사용한다면 아래 그림처럼 예상치 못한 문제가 발생할 수 있습니다.
네임스페이스를 이용하면 위 그림과 같은 문제를 해결할 수 있습니다.
네임스페이스 사용 방법
PHP 5.3.0 에서 추가된 네임스페이스를 사용하는 방법은 아래 소스코드처럼 네임스페이스로 붂고 싶은 곳에 namespace 를 추가하면 됩니다.
namespace 키워드 뒤에 지정하고자 하는 네임스페이스를 작성하면 됩니다. 네임스페이스의 구분자는 \ 를 사용합니다. ( 자바에서는 .(점)을 사용하죠. ) 그러면 MyClass{ } 와 myFunction( ) 은 myNamespace\mySubNamespace 라는 네임스페이스에 묶이게 됩니다. MyClass 와 myFunction 을 사용하는 방법은 아래 소스코드와 같습니다.
주의할 점은 인스턴스를 생성하거나 함수를 호출할 때에는 네임스페이스 맨 앞에 \ 를 붙여야 합니다. 이것은 디렉터리에서 절대경로 ( cd \etc )와 같다고 보시면 됩니다. 이 절대경로의 개념은 네임스페이스에 속한 클래스나 함수가 아닌 전역 클래스나 함수에 접근하는데 활용됩니다. 아래의 코드는 전역 함수를 호출하는 예제입니다.
PHP의 문자열 함수인 prinft() 와 동일한 이름으로 함수를 정의합니다. 이미 우리는 myNamespace\mySubNamespace 안에서 코드를 작성하고 있기 때문에 printf()를 호출하면 새로 정의한 printf() 함수가 동작합니다. \myNamespace\mySubNamespace\printf() 를 사용해도 마찬가지로 같은 함수가 호출됩니다. 하지만 \ 는 전역을 의미하므로 \printf() 를 호출하게 되면 원래 PHP 에서 제공하는 전역 함수인 printf() 를 실행합니다.
결과 값은 아래와 같습니다.
주의
네임스페이스는 주석을 제외한 그 어떤 코드보다도 먼저 정의되어야 합니다. 만약 아래와 같이 namespace 보다 앞서서 다른 코드가 있다면 오류가 발생합니다.
다중 네임스페이스
PHP 의 네임스페이스는 하나의 파일에서 여러 개의 네임스페이스를 허용합니다. 코드를 보시면 바로 이해될 것 같습니다.
실행 결과는 아래와 같습니다.
한 파일에 네임스페이스가 두개 이상 있을 수 있습니다. 단, 순차적으로 적용되기 때문에 마지막 줄에서 printf()를 실행했을 땐 SecondaryNamespace 의 prinft() 가 실행됩니다. 실행 결과에서 SecondaryNamespace 의 prinft() 를 통해서 mySubNamespace 의 prinft() 가 실행됐다는 것을 알 수 있습니다. 네임스페이스가 정의된 위치에 따라서 다르게 묶이기 때문에 다중 네임스페이스를 활용할 땐 조심해야 할 것 같습니다. 의도하지 않은 버그가 생길 수 있을테니까요.
아무래도 하나의 파일엔 하나의 네임스페이스만 사용하는 게 가장 좋을 것 같습니다.
네이스페이스 활용
네임스페이스는 파일과는 상관없이 지정할 수 있습니다. MyCalss1.php 과 MyClass2.php 파일이 같은 네임스페이스를 가질 수 있습니다. 이렇게 구성하게 되면 아래 그림과 같이 여러 파일에 나뉘어진 클래스를 하나로 묶을 수 있습니다. 그러면 동일한 myNamespace 네임스페이스 안에서 MyClass1 과 MyClass2 를 사용할 수 있게 됩니다. 단, 같은 네임스페이스 안에서는 파일이 나뉘어져 있더라도 클래스나 함수 등이 중복될 수 없습니다.
마치며
프로그램이 커질 수록 복잡도가 증가하게 되는데 네임스페이스를 활용하면 소스 코드를 구조화 할 수 있습니다. 물리적으로 디렉터리를 구분해서 PHP 파일을 나누는 것과는 다르게 PHP 프로그램 내에서 클래스와 함수 그리고 변수를 구조적으로 작성할 수 있기 때문에 보다 발전된 코드를 작성할 수 있을 것이라 기대합니다.
About the Author
Write a Comment
Gravatars are small images that can show your personality. You can get your gravatar for free today!

