고급 PHP 프로그래밍 – 객체 지향 PHP – 3 – 네임스페이스

고급 PHP 프로그래밍 - 객체 지향 PHP - 3 - 네임스페이스
고급 PHP 프로그래밍 – 객체 지향 PHP – 3 – 네임스페이스

고급 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 규칙에 대해서도 더 자세히 다뤄볼게요~

오늘도 천천히, 하지만 꾸준히 배워나가는 여러분 최고예요! 💪💻📁🌱

답글 남기기