<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHPK.org &#187; 네임스페이스</title>
	<atom:link href="http://www.phpk.org/archives/tag/%eb%84%a4%ec%9e%84%ec%8a%a4%ed%8e%98%ec%9d%b4%ec%8a%a4/feed" rel="self" type="application/rss+xml" />
	<link>http://www.phpk.org</link>
	<description>PHP User Group</description>
	<lastBuildDate>Tue, 17 Jan 2012 17:17:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[PHP5.3.0] Namespaces(네임스페이스)</title>
		<link>http://www.phpk.org/archives/321</link>
		<comments>http://www.phpk.org/archives/321#comments</comments>
		<pubDate>Wed, 29 Jul 2009 10:01:09 +0000</pubDate>
		<dc:creator>ooti</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[PHP5.3.0]]></category>
		<category><![CDATA[네임스페이스]]></category>

		<guid isPermaLink="false">http://www.phpkorea.org/archives/321</guid>
		<description><![CDATA[PHP 5.3.0 에서는 아주 반가운 기능이 추가되었습니다. PHP는 버전 5로 올라오면서 본격적으로 OOP를 지원하고 있습니다. 이제는 클래스로 기능을 묶는 것이 일반화되었습니다. 그럼에도 불구하고 PHP에서는 왠지 부족함이 느껴졌습니다. 바로 네임스페이스가 없었습니다. 이 네임스페이스가 드디어 5.3.0 버전에서 추가되었습니다. 네임스페이스가 왜 필요한가 네임스페이스는 코드를 묶는 추상적인 개념으로 클래스를 파일이라고 한다면 네임스페이스는 디렉터리라고 할 수 있습니다. 클래스는 비슷한 기능을 [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3.0 에서는 아주 반가운 기능이 추가되었습니다. PHP는 버전 5로 올라오면서 본격적으로 OOP를 지원하고 있습니다. 이제는 클래스로 기능을 묶는 것이 일반화되었습니다. 그럼에도 불구하고 PHP에서는 왠지 부족함이 느껴졌습니다. 바로 네임스페이스가 없었습니다. 이 네임스페이스가 드디어 5.3.0 버전에서 추가되었습니다.</p>
<h3>네임스페이스가 왜 필요한가</h3>
<p>네임스페이스는 코드를 묶는 추상적인 개념으로 클래스를 파일이라고 한다면 네임스페이스는 디렉터리라고 할 수 있습니다. 클래스는 비슷한 기능을 하는 함수들을 하나로 묶어 놓은 것입니다. 예를 들면 class DB 에는 select(), insert(), delete(), update() 등 함수가 있을 수 있습니다. 네임스페이스는 DB 클래스가 어디에 속했는 지를 나타냅니다. 자바에는 package 라는 네임스페이스가 있습니다.</p>
<p>PHP에서 클래스를 작성하다 보면 클래스 이름이 중복되어 곤란한 경우가 있습니다. PEAR 에는 DB 클래스가 있습니다. 그런데 Zeroboard XE 의 라이브러리에도 DB 클래스가 있습니다. 만약 PEAR 와 Zeroboard XE를 같이 사용한다면 아래 그림처럼 예상치 못한 문제가 발생할 수 있습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-152051.jpg"><img title="2009-07-29_152051" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="225" alt="2009-07-29_152051" src="http://blog.phpkorea.org/files/20090729-152051-thumb.jpg" width="405" border="0" /></a> </p>
<p>네임스페이스를 이용하면 위 그림과 같은 문제를 해결할 수 있습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-163442.jpg"><img title="2009-07-29_163442" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="279" alt="2009-07-29_163442" src="http://blog.phpkorea.org/files/20090729-163442-thumb.jpg" width="410" border="0" /></a></p>
<h3>네임스페이스 사용 방법</h3>
<p>PHP 5.3.0 에서 추가된 네임스페이스를 사용하는 방법은 아래 소스코드처럼 네임스페이스로 붂고 싶은 곳에 namespace 를 추가하면 됩니다.</p>
<p>&#160;</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185303.jpg"><img title="2009-07-29_185303" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="149" alt="2009-07-29_185303" src="http://blog.phpkorea.org/files/20090729-185303-thumb.jpg" width="515" border="0" /></a></p>
<p>namespace 키워드 뒤에 지정하고자 하는 네임스페이스를 작성하면 됩니다. 네임스페이스의 구분자는 \ 를 사용합니다. ( 자바에서는 .(점)을 사용하죠. ) 그러면 MyClass{ } 와 myFunction( ) 은 myNamespace\mySubNamespace 라는 네임스페이스에 묶이게 됩니다. MyClass 와 myFunction 을 사용하는 방법은 아래 소스코드와 같습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185506.jpg"><img title="2009-07-29_185506" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="122" alt="2009-07-29_185506" src="http://blog.phpkorea.org/files/20090729-185506-thumb.jpg" width="514" border="0" /></a> </p>
<p>주의할 점은 인스턴스를 생성하거나 함수를 호출할 때에는 네임스페이스 맨 앞에 \ 를 붙여야 합니다. 이것은 디렉터리에서 절대경로 ( cd \etc )와 같다고 보시면 됩니다. 이 절대경로의 개념은 네임스페이스에 속한 클래스나 함수가 아닌 전역 클래스나 함수에 접근하는데 활용됩니다. 아래의 코드는 전역 함수를 호출하는 예제입니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185606.jpg"><img title="2009-07-29_185606" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="169" alt="2009-07-29_185606" src="http://blog.phpkorea.org/files/20090729-185606-thumb.jpg" width="512" border="0" /></a> </p>
<p>PHP의 문자열 함수인 prinft() 와 동일한 이름으로 함수를 정의합니다. 이미 우리는 myNamespace\mySubNamespace 안에서 코드를 작성하고 있기 때문에 printf()를 호출하면 새로 정의한 printf() 함수가 동작합니다. \myNamespace\mySubNamespace\printf() 를 사용해도 마찬가지로 같은 함수가 호출됩니다. 하지만 \ 는 전역을 의미하므로 \printf() 를 호출하게 되면 원래 PHP 에서 제공하는 전역 함수인 <a title="printf()" href="http://www.php.net/manual/en/function.print.php">printf()</a> 를 실행합니다.</p>
<p>결과 값은 아래와 같습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185748.jpg"><img title="2009-07-29_185748" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="93" alt="2009-07-29_185748" src="http://blog.phpkorea.org/files/20090729-185748-thumb.jpg" width="512" border="0" /></a> </p>
<h3>주의</h3>
<p>네임스페이스는 주석을 제외한 그 어떤 코드보다도 먼저 정의되어야 합니다. 만약 아래와 같이 namespace 보다 앞서서 다른 코드가 있다면 오류가 발생합니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185905.jpg"><img title="2009-07-29_185905" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="102" alt="2009-07-29_185905" src="http://blog.phpkorea.org/files/20090729-185905-thumb.jpg" width="510" border="0" /></a> </p>
<h3>다중 네임스페이스</h3>
<p>PHP 의 네임스페이스는 하나의 파일에서 여러 개의 네임스페이스를 허용합니다. 코드를 보시면 바로 이해될 것 같습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-185957.jpg"><img title="2009-07-29_185957" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="2009-07-29_185957" src="http://blog.phpkorea.org/files/20090729-185957-thumb.jpg" width="514" border="0" /></a> </p>
<p>실행 결과는 아래와 같습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-190040.jpg"><img title="2009-07-29_190040" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="36" alt="2009-07-29_190040" src="http://blog.phpkorea.org/files/20090729-190040-thumb.jpg" width="509" border="0" /></a> </p>
<p>한 파일에 네임스페이스가 두개 이상 있을 수 있습니다. 단, 순차적으로 적용되기 때문에 마지막 줄에서 printf()를 실행했을 땐 SecondaryNamespace 의 prinft() 가 실행됩니다. 실행 결과에서 SecondaryNamespace 의 prinft() 를 통해서 mySubNamespace 의 prinft() 가 실행됐다는 것을 알 수 있습니다. 네임스페이스가 정의된 위치에 따라서 다르게 묶이기 때문에 다중 네임스페이스를 활용할 땐 조심해야 할 것 같습니다. 의도하지 않은 버그가 생길 수 있을테니까요.</p>
<p>아무래도 하나의 파일엔 하나의 네임스페이스만 사용하는 게 가장 좋을 것 같습니다.</p>
<h3>네이스페이스 활용</h3>
<p>네임스페이스는 파일과는 상관없이 지정할 수 있습니다. MyCalss1.php 과 MyClass2.php 파일이 같은 네임스페이스를 가질 수 있습니다. 이렇게 구성하게 되면 아래 그림과 같이 여러 파일에 나뉘어진 클래스를 하나로 묶을 수 있습니다. 그러면 동일한 myNamespace 네임스페이스 안에서 MyClass1 과 MyClass2 를 사용할 수 있게 됩니다. 단, 같은 네임스페이스 안에서는 파일이 나뉘어져 있더라도 클래스나 함수 등이 중복될 수 없습니다.</p>
<p><a href="http://blog.phpkorea.org/files/20090729-184100.jpg"><img title="2009-07-29_184100" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="220" alt="2009-07-29_184100" src="http://blog.phpkorea.org/files/20090729-184100-thumb.jpg" width="476" border="0" /></a> </p>
<h3>마치며</h3>
<p>프로그램이 커질 수록 복잡도가 증가하게 되는데 네임스페이스를 활용하면 소스 코드를 구조화 할 수 있습니다. 물리적으로 디렉터리를 구분해서 PHP 파일을 나누는 것과는 다르게 PHP 프로그램 내에서 클래스와 함수 그리고 변수를 구조적으로 작성할 수 있기 때문에 보다 발전된 코드를 작성할 수 있을 것이라 기대합니다.</p>
<ul>
<li>예제 소스 코드 : <a href="http://pastebin.kr/yETM">http://pastebin.kr/yETM</a> </li>
<li>참고 : <a href="http://kr.php.net/manual/en/language.namespaces.php">http://kr.php.net/manual/en/language.namespaces.php</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.phpk.org/archives/321/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  www.phpk.org/archives/tag/%eb%84%a4%ec%9e%84%ec%8a%a4%ed%8e%98%ec%9d%b4%ec%8a%a4/feed ) in 0.14598 seconds, on Feb 8th, 2012 at 8:59 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Feb 8th, 2012 at 9:59 am UTC -->
