해결된 질문
작성
·
496
답변 2
2
안녕하세요.
namespace 와 extends 는 정말! 다릅니다. 이 둘은 동일 선상에 놓을 수 없습니다. 먼저, namespace 는 PHP 에서 제공하는 고유기능입니다. 타 언어를 경험해보셨다면 패키지라는 것이 있을 텐데 그 패키지를 선언하는 것과 비슷합니다. extends 는 객체지향의 핵심개념 중 하나로 상속을 할 때 사용됩니다.
namespace
namespace 는 함수, 클래스 등에 대해 범위(Scope)를 지정할 때 씁니다. 예를 들어 A 클래스(A`a)가 있다고 가정해봅시다.
class A
{
}
이번에는 네임스페이스 A 를 선언하고 똑같이 A 클래스(A`b)를 만들어보죠.
namespace A;
class A
{
}
이 둘의 차이는 뭘까요? A`a 는 네임스페이스가 선언되지 않은 상태이지만 글로벌 네임스페이스라는 범위에 소속됩니다. 따라서 A`a 를 생성하기 위해서는 $a = new \A() 형태로 할 수 있습니다. 그러나 A`b 는 A 네임스페이스 아래에 소속되어있습니다. A`b 를 생성하기 위해서는 $a = new \A\A() 가 되어야 합니다. A, A\A 는 전혀 다른 클래스로 분류됩니다. 클래스의 이름은 같지만 범위가 다르기 때문에 둘은 다릅니다. 전역변수 $a 와 로컬변수 $a 가 다른 것과 마찬가지입니다. 포토샵을 해보셨다면 레이어(Layer) 같은 것이죠. 서로 다른 도화지인 것입니다.
네임스페이스가 탄생한 배경에는 너무 긴 클래스 명이 작성될 수도 있다는 것도 있습니다. 클래스의 이름은 길면 길수록 가독성이 떨어지는 코드가 되고 정체성이 모호해집니다. 예를 들어 언어(Languages)에는 PHP 가 있고 클래스로 만들어야 한다고 생각해봅시다. 그렇다면 각 클래스의 이름은 어떻게 될 수 있을까요?
먼저 네임스페이스가 없는 경우에는 Languages_Php 클래스(B`a)를 만들어야합니다.
class Languages_Php
{
}
네임스페이스를 사용하면 어떻게 될까요? Php 클래스(B`b)로 선언하면 된답니다.
namespace Languages;
class Php
{
}
어떤 사람이 보아도 B`a 보다 B`b 가 더 나은 코드라는 것을 알 수 있습니다. PHP 에서 네임스페이스는 폴더구조와 매핑하는 것을 표준으로 하고 있습니다. PHP 에서 권하는 표준인 PSR 에서 PSR-4 에 의하면 네임스페이스와 폴더구조는 매핑되어야 합니다. B`b 클래스는 아래와 같이 폴더구조가 형성되어야 합니다.
Languages (Directory)
┕ Php.php
네임스페이스가 있으면 프로젝트의 폴더가 어떤구조를 가지고 있는지, 어느 것을 나타내는지 분명하게 알 수 있는 수단이 됩니다. B`b 는 $php = new \Languages\Php() 형태로 생성합니다.
extends
extends 는 객체지향의 주요 개념 중 하나인 상속과 연관됩니다. 다른 언어에서도 extends 라는 키워드로 클래스를 상속합니다. 상속은 대표적으로 A는 B다 일때 사용되는데, 예를 들어 "PHP는 언어다" 라는 말은 성립됩니다.
class Language
{
}
class Php extends Language
{
}
namespace 와 어떤 차이가 있습니까? 먼저 단수형, 복수형의 차이가 있지만 그 부분은 생략하기로 하고, 부모 클래스인 Language 클래스의 생성이 필요합니다. 상속을 하게되면 public, protected 가시성을 가진 부모의 프로퍼티와 메서드가 자식에게 넘어옵니다. 네임스페이스에는 그런 기능이 없습니다. 네임스페이스는 그저 범위(Scope)를 표현합니다. 상속은 폴더구조와도 전혀 관련이 없습니다. 오직 부모-자식 관계를 표현할 뿐입니다. 네임스페이스는 같은 이름의 클래스이지만 범위에 따라 \A, \A\A 로 분리되었는데, 하지만 상속은 그냥 \A 하나 뿐입니다.
"PHP 는 언어(Languages)라서 상속을 사용해도 되니까 네임스페이스 기능을 대체할 수 있는 거 아니야?" 라고 의문을 가지셨을 수도 있다는 생각이 듭니다. 어느 부분에서 헷갈려하시는 지는 저도 이해하긴 했지만, namespace, extends 는 개념도, 용도도 서로 다르기때문에 분명하게 분리하실 필요가 있습니다.
1
이 질문이 강의소개 - 참고 할만한 질의 응답에 추가됩니다.