상현에 하루하루
All 개발자의 하루

namespace와 use

( 업데이트: )

namespace와 use는 무엇이냐 하면 C#에서의 namespace와 using과 같고 Java에서의 package와 import와 같은 개념입니다.

점차 프로젝트가 커지고 많은 라이브러리를 참조해서 사용하는 프로젝트에서 클래스 명이 전부 독립적으로 사용될 수는 없습니다.

예를 들어 두 종류의 데이터베이스를 사용하는 시스템이라하면 mssql 과 oracle이라 가정하면 mssql connection 클래스와 oracle connection 클래스가 있을 때 이 두 클래스 이름은 Connection으로 같은 이름이라고 하면 선언할 때 어떤 클래스가 선언되었는지 알 수가 없어집니다.

이 것을 극복하기 위해 namespace와 use를 사용합니다.

// foo.php

Class DB {}

// bar.php

Class DB {}

// app.php

include 'foo.php';
include 'bar.php';

$db = new DB(); // 🤔??

네임스페이스를 사용하면 클래스는 각각의 namespace의 이름을 통해 격리되므로 다른 이가 작성한 코드와 중복되는 것을 걱정하지 않고 코드를 작성할 수 있다.

// foo.php

namespace foo;

Class DB {}

// bar.php

namespace bar;

Class DB {]

// app.php

include 'foo.php';
include 'bar.php';

$db = new foo\DB();

네임스페이스는 특별히 명시하지 않으면 전역 네임스페이스에 속하게 됩니다.

또 as 키워드를 사용하여 클래스에 별칭을 부여할 수 있습니다.

include 'foo.php';

use foo as foo2;

주의‼️

namespace WikiBooks;

use FileLog\Logger;

이 상태에서 FileLog 네임스페이스에 있는 Logger라는 외부 클래스를 사용하고 싶은 경우가 있는데 당므 과같이 use 키워드를 사용하면 Class 'WikiBooks\FileLog\Logger' not found라는 에러가 발생할 것입니다.

이는 현재 네임스페이스가 WikiBooks로 고정되어 버렸으므로 WikiBooks\FileLog\Logger 클래스를 찾기 떄문에 발생한 문제입니다.

현재 네임스페이스보다 상위에 있는 클래스를 사용하려면 다음과 같이 네임스페이스 앞에 슬래시를 붙여주면 전역 네임스페이스에서 클래스를 찾게 됩니다.

namespace Wikibooks;

use \FileLog\Logger;