본문 바로가기

PHP

[php] namespace 란? 그 의미와 쓰는 이유는? 예시

 

- namespace 가 필요한 상황 -


Hello() 라는 이름으로 클래스를 만들려고 한다.
물론 이름이 겹치지 않도록 하는 게 일단 가장 좋겠지만,
똑같은 이름으로 여러 클래스가 존재할 수도 있다.
아래는 예시다.

class Hello {
    function __construct() {
        echo '안녕하세요. 환영합니다.';
    }
}


class Hello {
    function __construct() {
        echo 'Nice to meet you. Welcome.';
    }
}



%obj = new Hello();
만약 이렇게 실행하면 어떤 쪽이 실행될까?.
똑같은 이름으로 Hello 클래스가 두 개 존재하는데,
Hello 인스턴스를 만들면 누구를 만들게 될까?

 

 

- namespace 의미와 쓰는 이유 -

이런 경우를 대비해서 바구니를 만들 수 있다.
이름이 똑같은 클래스라도 서로 다른 바구니에 담아 두면 된다.
그리고 그 바구니에 이름을 붙인다.
클래스를 부를 때는, 이제 그 바구니를 함께 말하면 된다.
그럼 똑같은 이름을 가지는 클래스라도 헷갈리지 않는다.
A 바구니에 담긴 Hello 주세요.
B 바구니에 담아 놓은 Hello 주세요.
이런 식으로 달라고 하면 된다.

여기서 바구니 역할을 하는 게 'namespace'다.
그리고 그 바구니를 부르는 방법은 'use'다.
아래에서 예시를 보자.

namespace ko;

class Hello {
    function __construct() {
        echo '안녕하세요. 환영합니다.';
    }
}

namespace en;

class Hello {
    function __construct() {
        echo 'Nice to meet you. Welcome.';
    }
}

 

- use 의 의미와 사용법 - 

앞에서 'namespace'가 클래스들을 담는 바구니 역할을 한다고 했다.
그리고 그 바구니를 부르는 방법은 'use'다.

위를 보면, 똑같이 'Hello'라는 이름으로 클래스를 두 개 만들었다.
하지만 'namespace' 다르다.
하나는 'ko'에 담았고, 
다른 하나는 'en'에 담았다.
꺼내올 때는 어떻게 하면 될까?
아래를 보자.

use en;
$obj1 = new en\Hello();

use ko;
$obj2 = new ko\Hello();


'use'를 먼저 말하면,
어떤 'namespace'에서 꺼내오고 싶은지 알려준다.

아니면 아래처럼 'use'를 쓰지 않고 
클래스 이름 앞에 바로 붙일 수도 있다.

$obj1 = new \en\Hello();
$obj2 = new \ko\Hello();

 

- use 를 쓰는 이유 -

그럼 굳이 'use'를 쓰는 이유는 무엇일까?
그냥 namespace를 그때그때 클래스 앞에다가 붙이면
헷갈릴 일도 없고 더 좋지 않을까?


여기서 계층을 더 깊게 나누게 되면 장점이 바로 보인다.
폴더 안에 폴더를 만드는 것과 비슷하다.
큰 바구니 안에 작은 바구니를 넣어 두는 것이다.
넣는 법은, namespace 똑같이 쓰고 그 뒤에 계층을 경로로 붙인다.
아래는 예시다.

namespace greeting\en;
class Hello{ ~~~~ }

namespace greeting\ko;
class Hello{ ~~~~ }

use greeting\en;
$obj1 = new en\Hello();
use greeting\ko;
$obj2 = new ko\Hello();


마찬가지로 'use'를 쓰지 않고
클래스에 바로 경로를 붙여서 부를 수도 있다.

$obj1 = new \greeting\en\Hello();
$obj2 = new \greeting\ko\Hello();


이렇게 보니까, use를 안 쓰고 경로를 직접 붙이는 코드보다
어떤 경로를 쓸지 앞에서 use로 미리 말해 놓은 코드 쪽이
길이가 훨씬 줄어드는 게 보인다.


근데 namespace를 바꿀 때마다 이렇게 새로 불러야 할까?
경로 이름이 길어지거나 계층이 세 단계, 네 단계, 깊어지면?
namespace를 지정하는 일이 아주 번거로운 일이 된다.
그래서 더 간단하게 부르는 방법도 있다.
그냥 별칭을 붙여 버리는 방법이다.
alias 를 붙이면 다른 이름처럼 부를 수 있다.
별칭 붙이는 방법은 아래와 같다.

use 경로 as 별칭

use greeting\en\Hello as HelloEn;
use greeting\ko\Hello as HelloKo;

$obj1 = new HelloEn();
$obj2 = new HelloKo();



참고 자료 : https://www.youtube.com/watch?v=OPH_3gmv5ro&list=PLuHgQVnccGMDzq8zAwEY5lvwDWXWTZjB6&index=21

반응형