인프런 커뮤니티 질문&답변

cafe small house님의 프로필 이미지

작성한 질문수

PHP 7+ 프로그래밍: 객체지향

07 - 네임스페이스 (Namespaces)

namespace vs extends 에 대해서 궁금합니다!

해결된 질문

작성

·

485

1

선생님 안녕하세요! namespace를 공부하다가 음.. 이게 extends와 비슷한거 같은데 extends 가 있는데 왜 굳이 namespace도 있어야 하나 그런 생각이 들었습니다 아직 이해를 제대로 못하고 있어서 그런거 같기도 하고요 package manager..? 시간에 진가가 나온다고 하셔서 그때 가면 또 다르게 이해가 될수도 있겠지만 저의 질문은 아래와 같습니다

- namespace 와 extends 조금 어떻게 다를까요?

답변 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

정말정말 감사합니다! 거의 아예 다른 개념이네요! 이렇게 친절하게 정리해주셔서 감사드립니다! 이렇게 좋은 강의가 없네요ㅠㅠ 감사합니다!