본문 바로가기
PHP/생활코딩

6/1(2) 생활코딩 - PHP 기본수업 - 상속

by SKim입니다 2020. 6. 1.

35. 상속 - Override(재정의)와 Parent

상속으로 인해서 복잡성이 생겼다.

 

(1) Override

: 부모 자식 클래스 간의 관계에서 메소드를 어떻게 할 것인가라는 주제

 

 

 

ParentClass와 ChildCalss가 있다.

ChildCalss는 ParentClass를 상속받고 있다.

 

이 때, ParentClass가 갖고 있지 않은 클래스를 추가하는 것은

그냥 일반적인 기능이고,

 

그거 말고 ParentClass가 이미 CallMethod라는 메소드를 갖고 있는데

ChildCalss에서 똑같은 이름의 다른 메소드를 사용하고 싶을 때,

 

ParentClass가 갖고 있던 메소드를

ChildCalss에서 덮어쓰는 기법을 Override라고 한다.

 

 

그리고 그 때 우리가 살펴볼 새로운 키워드는 Parent라는 키워드이다.

 

 

 

 

자식클래스에 똑같은 함수를 정의한다.

이 때 형식은 같아야 한다.

($param, $param2) 이렇게 하면 에러난다.

 

우리가 자식 메소드를 만들면서 

처음부터 끝까지 다 구현하는 것은 힘든 일이다.

 

그런 경우에 부모 클래스가 갖고 있는,

이미 존재하고 있는 메소드를 호출한 후에

부가적으로 필요한 정보를 처리할 수있다.

 

이런 경우에 자식 클래스에서 callMethod라는 함수를 만들어버리면

$this로 callMethod를 지명하면 자식 클래스의 callMethod를 지명하는 것이 되어버린다.

 

이런 경우에 parent::을 사용한다.

이것을 실행시키면

여기서 callMethod를 호출하게 된다.

그러면 둘 다 호출된다.

(순서??)

 

 

 

35. 상속 - 접근제어자 protected

캡슐화 - 내부의 메커니즘을 감춰서 외부의 불필요한 접근을 막는 것

 

캡슐화에서 핵심적인 역할을 했던 것이 접근제어자였다.

private/public

+ 이번시간에는 protected

 

접근제어자 + 상속

 

 

 

Parent Class와 그것을 상속받는 Child Class가 있다.

 

Parent Class에는 세 가지 변수들이 존재하고,

그 각각의 변수들을 함수 내에서 호출할 때와

함수 바깥에서 객체를 직접 호출할 때 어떤 경우의 수가 생기는지 살펴보겠다.

 

 

 

우리가 객체에 접근하려고 했을 때,

_public에 들어가면,

일단 Child Class의 인스턴스 변수 중에는 $_public이 없기 때문에

부모에게 있는지 확인한다.

있으니까 출력했다.

 

$_private도 같은 방식으로

부모에게 확인했더니 private이다.

그럼 에러를 출력한다.

 

 

이번에는 이 property들을 메소드를 통해서 호출해보겠다.

 

 

두 그림의 마지막 줄을 추가했더니

 

이렇게 두 개 다 출력이 잘 된다.

 

 

 

 

이번에는 private를 호출해봤다.

존재하지 않는다고 나온다.

∵ private라는 접근제어자가 붙어있는 변수는

그 클래스 안에서만 유효하고,

자식은 거기 접근하지 못한다.

 

 

 

만약 callPrivate 함수를 부모 클래스로 이동하면 출력이 된다.

 

∵ callPrivate 함수의 소재는 부모 클래스이고,

$_private는 부모 클래스에 위치하기 때문이다.

 

 

정리하면,

public은 부모 자식 모두 접근 가능하다.

private은 부모에서만 접근할 수 있고

자식에서는 접근할 수 없다.

 

 

protected

: 부모 자식간의 메소드들끼리는 서로 접근 가능하면서

메소드 밖에서 인스턴스를 통해서 직접 호출하는 것은 불가능

 

 

메소드 밖에서 인스턴스를 통해서 직접 호출하는 것은

아래 그림에서 회색으로 선택된 부분과 같은 것을 의미한다.

 

 

 

 

echo를 주석처리하고 callProtected라는 메소드를 통해서

protected라는 property에 접근하면

 

잘 뜬다.

 

 

즉, protected는

이 인스턴스를 통해서 직접 접근하는 것은 금지시키면서

동시에 상속관계를 통해 연결되어 있는 자식 클래스에서

부모 클래스가 갖고 있는 protected 접근제어자에는 접근이 가능하다.

 

 

 

35. 상속 - 상속/override 금지

final 키워드

 

 

함수 b 앞에 final을 붙였더니

override가 불가능하다는 에러가 뜬다.

 

 

class 전체를 상속받지 못하게 하려면

class 앞에 final을 붙이면 된다.

댓글