inflearn logo
강의

Khóa học

Chia sẻ kiến thức

PHP 7+: Lập trình hướng đối tượng

07 - Không gian tên

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

Đã giải quyết

649

cafe small house

16 câu hỏi đã được viết

1

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

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

namespace php oop

Câu trả lời 2

2

pronist

안녕하세요.

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 는 개념도, 용도도 서로 다르기때문에 분명하게 분리하실 필요가 있습니다. 

 

0

pronist

이 질문이 강의소개 - 참고 할만한 질의 응답에 추가됩니다.

1

cafe small house

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

패케지스트를 하지 않고 섹션7을 수행할수 있나요

0

90

1

나만의 프레임워크 작성 후, 운영환경 배포에 관한 문의 드려요

0

399

1

35강 미들웨어에서 인증 과정을 Auth클래스로 만들면, 어느 디렉토리에 둘까요?

0

335

1

ios환경에서는 어떻게 설치해야 하나요?

0

445

1

라라벨(php) 배포 문의

0

1651

1

왜 http://localhost/ 로 접근하면 public/index.php 가 실행되나요?

0

2102

1

http://localhost:8080/posts/1 접근시 배열 0값 표기 오류

0

396

1

xdebug 설치

0

667

1

localhost 경로

0

441

1

class not found

1

327

1

namespace class not found 질문

0

466

1

csrfmiddelware 에러 질문입니다

0

363

2

url Parttern Parts 가 무슨뜻인가요?

0

349

1

통합 개발환경 (IDE) 관련 문의

0

246

1

Route 클래스 질문이 있습니다!

0

297

1

모델 User 등에서 속성들을 protected 나 private 으로 설정하지 않는 이유가 있습니까?

0

340

1

안녕하세요 프로젝트를 react와 연동하기에 대해서 여쭈고 싶습니다 :)

1

1377

1

DatabaseSessionHandler.php 에러 해결 부분

0

298

1

안녕하세요. 라우터 서버 연결 질문이 있습니다.

1

281

1

아니 강사님 왜 자꾸 어어 거려요? 진짜 겁나 거슬려 죽겠네 ㅡㅡ 어좀 적당히해요 거슬려 죽겠네 그리고 마이크 좀 좋은거 쓰세요 볼륨이 낮아졌다 커졌ㄷ ㅏ하고 발음도 다뭉개져지고 딕션도 안 좋아서 하나도 안들려요 진짜 개짜증나네

1

572

2

로컬환경에서 개발 후 운영환경으로 배포 시 발생하는 이슈에 대한 문의입니다.

1

574

2

DatabaseSessionHandler 클래스의 gc($maxlifetime) 메소드에 대해 질문드립니다.

2

257

1

Xdebug 설치 후 php index.php 실행하면 오류가 납니다..!

0

1133

1

CentOS 7.* 서버쪽으로 배포를 해보던 중에 질문드립니다.

1

366

1