
고급 PHP 프로그래밍 – 객체 지향 PHP – 네임스페이스
안녕하세요~ 😊
오늘은 객체 지향 PHP에서 **꼭 알아야 할 개념 중 하나인 “네임스페이스(namespace)”**에 대해 자세히 알아보는 시간을 가져보겠습니다.
네임스페이스는 말 그대로 “이름의 공간”이에요.
규모가 커지는 프로젝트나 외부 라이브러리를 함께 사용할 때 클래스 이름 충돌 문제를 해결하고, 코드 구조를 체계적으로 정리할 수 있게 해줘요.
한 마디로, 같은 이름의 클래스가 서로 부딪히지 않게 하는 마법 같은 도구라고 할 수 있어요! ✨
네임스페이스란 무엇인가요?
PHP에서 네임스페이스는 클래스, 함수, 상수의 이름을 구분할 수 있는 방법이에요.
비유하자면, “홍길동”이라는 이름을 가진 사람이 서울에도 있고, 부산에도 있을 수 있는데,
이걸 주소로 구분할 수 있는 것처럼, 클래스 이름도 “이름 공간”을 통해 서로 독립적으로 구분할 수 있는 거예요 😊
왜 네임스페이스가 필요할까요?
-
규모가 커질수록 클래스 이름 충돌이 발생하기 쉬워요.
-
외부 라이브러리와 내 프로젝트 코드가 같은 이름의 클래스를 가질 수 있어요.
-
유지보수와 구조화가 쉬워지고, **자동 로딩(autoloading)**과의 연동도 원활해져요.
-
-
네임스페이스 선언하기
PHP 파일의 가장 첫 줄에 namespace
키워드를 사용해서 선언합니다.
php복사편집<?php
namespace App\Controllers;
class UserController {
public function index() {
echo "사용자 목록 페이지";
}
}
반드시
namespace
는 **파일의 최상단(<?php 다음)**에 위치해야 해요!
클래스 호출하기 – use
키워드
네임스페이스를 선언한 클래스를 다른 파일에서 사용할 때는
use
키워드나 \
(백슬래시)를 사용해서 **전체 경로(FQCN: Fully Qualified Class Name)**로 접근해줘야 해요.
✅ 방법 1: 전체 경로 직접 사용
php복사편집$obj = new \App\Controllers\UserController();
✅ 방법 2: use
로 불러오기
php복사편집use App\Controllers\UserController;
$obj = new UserController();
예제: 네임스페이스 없이 클래스 충돌하는 경우
php복사편집// File: library/User.php
class User {
public function getType() {
return "라이브러리 유저";
}
}
// File: app/User.php
class User {
public function getType() {
return "내부 유저";
}
}
같은 User
클래스가 두 파일에 존재하면 충돌이 발생해요 😵
네임스페이스로 해결하기
php복사편집// File: library/User.php
namespace Library;
class User {
public function getType() {
return "라이브러리 유저";
}
}
// File: app/User.php
namespace App;
class User {
public function getType() {
return "내부 유저";
}
}
// File: index.php
use Library\User as LibUser;
use App\User as AppUser;
$libUser = new LibUser();
$appUser = new AppUser();
echo $libUser->getType(); // 라이브러리 유저
echo $appUser->getType(); // 내부 유저
이렇게 하면 이름은 같아도, 완전히 다른 공간에서 작동하니까 충돌 없이 공존할 수 있어요!
함수와 상수도 네임스페이스 가능!
php복사편집namespace MyApp\Utils;
function sayHello() {
echo "안녕하세요!";
}
const VERSION = "1.0";
php복사편집use function MyApp\Utils\sayHello;
use const MyApp\Utils\VERSION;
sayHello(); // 안녕하세요!
echo VERSION; // 1.0
네임스페이스의 중첩 구조
네임스페이스는 디렉터리처럼 트리 구조로 구성할 수 있어요.
php복사편집namespace Company\Project\Module;
class Example { }
디렉터리 구조와 네임스페이스를 PSR-4 표준에 맞춰 일치시키면
오토로딩(autoloading)도 자동으로 가능해집니다!
네임스페이스와 자동 로딩(AutoLoading)
composer
를 사용할 때 autoload
섹션에 네임스페이스를 등록하면
클래스 이름만으로 자동으로 파일을 로딩할 수 있어요!
json복사편집{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
→ 이 설정 덕분에 App\Controllers\UserController
클래스는
src/Controllers/UserController.php
파일에서 자동으로 로드됩니다!
네임스페이스 사용 시 주의할 점 ✅
항목
주의사항
네임스페이스 선언 위치
항상 PHP 파일의 최상단에 위치해야 해요
use
는 import
클래스/함수/상수를 미리 등록해두는 것
충돌 방지
다른 라이브러리와 겹칠 이름은 네임스페이스로 해결
오토로딩 연동
PSR-4와 함께 쓰면 최강입니다!
전역 클래스 접근
\DateTime
처럼 역슬래시로 시작하면 전역 네임스페이스 사용
마무리 요약 🎯
개념
설명
네임스페이스
클래스, 함수, 상수의 이름 공간
선언
namespace My\Space;
사용
use My\Space\ClassName;
또는 new \My\Space\ClassName();
별칭 사용
use My\Space\ClassName as Alias;
자동 로딩
PSR-4 규칙과 함께 사용 시 클래스 자동 로딩 가능
마무리하며 😊
이제 여러분은 규모가 큰 PHP 프로젝트에서도
이름 충돌 걱정 없이 깔끔하고 안정적인 코드 구조를 짤 수 있는 힘을 갖추셨어요!
네임스페이스는 단순한 기능을 넘어, PHP 코드 아키텍처의 근간을 만드는 핵심 기술입니다.
지금 배워두면 나중에 프레임워크(Laravel, Symfony)나 컴포저(Composer) 연동 시에도 아주 큰 도움이 된답니다!
다음 시간에는 자동 로딩(Autoloading)과 PSR-4 규칙에 대해서도 더 자세히 다뤄볼게요~
오늘도 천천히, 하지만 꾸준히 배워나가는 여러분 최고예요! 💪💻📁🌱