[PHP5.3.0] Namespaces(네임스페이스)

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를 같이 사용한다면 아래 그림처럼 예상치 못한 문제가 발생할 수 있습니다.

2009-07-29_152051

네임스페이스를 이용하면 위 그림과 같은 문제를 해결할 수 있습니다.

2009-07-29_163442

네임스페이스 사용 방법

PHP 5.3.0 에서 추가된 네임스페이스를 사용하는 방법은 아래 소스코드처럼 네임스페이스로 붂고 싶은 곳에 namespace 를 추가하면 됩니다.

 

2009-07-29_185303

namespace 키워드 뒤에 지정하고자 하는 네임스페이스를 작성하면 됩니다. 네임스페이스의 구분자는 \ 를 사용합니다. ( 자바에서는 .(점)을 사용하죠. ) 그러면 MyClass{ } 와 myFunction( ) 은 myNamespace\mySubNamespace 라는 네임스페이스에 묶이게 됩니다. MyClass 와 myFunction 을 사용하는 방법은 아래 소스코드와 같습니다.

2009-07-29_185506

주의할 점은 인스턴스를 생성하거나 함수를 호출할 때에는 네임스페이스 맨 앞에 \ 를 붙여야 합니다. 이것은 디렉터리에서 절대경로 ( cd \etc )와 같다고 보시면 됩니다. 이 절대경로의 개념은 네임스페이스에 속한 클래스나 함수가 아닌 전역 클래스나 함수에 접근하는데 활용됩니다. 아래의 코드는 전역 함수를 호출하는 예제입니다.

2009-07-29_185606

PHP의 문자열 함수인 prinft() 와 동일한 이름으로 함수를 정의합니다. 이미 우리는 myNamespace\mySubNamespace 안에서 코드를 작성하고 있기 때문에 printf()를 호출하면 새로 정의한 printf() 함수가 동작합니다. \myNamespace\mySubNamespace\printf() 를 사용해도 마찬가지로 같은 함수가 호출됩니다. 하지만 \ 는 전역을 의미하므로 \printf() 를 호출하게 되면 원래 PHP 에서 제공하는 전역 함수인 printf() 를 실행합니다.

결과 값은 아래와 같습니다.

2009-07-29_185748

주의

네임스페이스는 주석을 제외한 그 어떤 코드보다도 먼저 정의되어야 합니다. 만약 아래와 같이 namespace 보다 앞서서 다른 코드가 있다면 오류가 발생합니다.

2009-07-29_185905

다중 네임스페이스

PHP 의 네임스페이스는 하나의 파일에서 여러 개의 네임스페이스를 허용합니다. 코드를 보시면 바로 이해될 것 같습니다.

2009-07-29_185957

실행 결과는 아래와 같습니다.

2009-07-29_190040

한 파일에 네임스페이스가 두개 이상 있을 수 있습니다. 단, 순차적으로 적용되기 때문에 마지막 줄에서 printf()를 실행했을 땐 SecondaryNamespace 의 prinft() 가 실행됩니다. 실행 결과에서 SecondaryNamespace 의 prinft() 를 통해서 mySubNamespace 의 prinft() 가 실행됐다는 것을 알 수 있습니다. 네임스페이스가 정의된 위치에 따라서 다르게 묶이기 때문에 다중 네임스페이스를 활용할 땐 조심해야 할 것 같습니다. 의도하지 않은 버그가 생길 수 있을테니까요.

아무래도 하나의 파일엔 하나의 네임스페이스만 사용하는 게 가장 좋을 것 같습니다.

네이스페이스 활용

네임스페이스는 파일과는 상관없이 지정할 수 있습니다. MyCalss1.php 과 MyClass2.php 파일이 같은 네임스페이스를 가질 수 있습니다. 이렇게 구성하게 되면 아래 그림과 같이 여러 파일에 나뉘어진 클래스를 하나로 묶을 수 있습니다. 그러면 동일한 myNamespace 네임스페이스 안에서 MyClass1 과 MyClass2 를 사용할 수 있게 됩니다. 단, 같은 네임스페이스 안에서는 파일이 나뉘어져 있더라도 클래스나 함수 등이 중복될 수 없습니다.

2009-07-29_184100

마치며

프로그램이 커질 수록 복잡도가 증가하게 되는데 네임스페이스를 활용하면 소스 코드를 구조화 할 수 있습니다. 물리적으로 디렉터리를 구분해서 PHP 파일을 나누는 것과는 다르게 PHP 프로그램 내에서 클래스와 함수 그리고 변수를 구조적으로 작성할 수 있기 때문에 보다 발전된 코드를 작성할 수 있을 것이라 기대합니다.

About the Author

ooti has written 44 stories on this site.

Write a Comment

Gravatars are small images that can show your personality. You can get your gravatar for free today!

CAPTCHA image

Copyright © 2010 PHPK.org. All rights reserved.
Theme by Fitobochka and ComFi.com Phone Cards Company.