R's Hacking Daily Log

php 객체 지향 프로그램 (3) 본문

PHP

php 객체 지향 프로그램 (3)

hanhxx 2023. 7. 13. 15:27

Step 1 :: 상속 [ inheritance ]

상속이라는 개념은 실세계에서 말하는 상속과 동일한 의미를 내포한다. 

 

기존의 생성한 클래스와 유사하지만 몇 개의 기능이 추가된 또 다른 클래스를 만들고자 할 때

상속이라는 기능을 활용할 수 있다. 

 

상속받는 클래스를 자식 클래스, 상속 해주는 클래스를 부모 클래스라고 부른다.

이때 자식 클래스는 부모 클래스의 멤버 변수, 메서드 등 모든 구성 요소를 사용할 수 있게 되며

추가로 자신 만의 메서드와 멤버 변수를 정의할 수 있다. 

 

** 접근 제어자 파트에서 정의했듯이 부모 클래스에서 private 접근 제어자로 정의한 property나 method에는 

아무리 자식 클래스라고 하더라도 접근 권한이 주어지지 않는다. 

 

 

부모 클래스 역할을 할 Parents class를 생성하고 멤버 변수 parents에 "parent class"라는 값을 할당한다. 

 

 

자식 클래스 Child class에서는 Parents class를 상속받기 위해 extends keyword를 사용하였다. 

Child class 안에는 echoParents함수가 정의되어 있고 이 함수는 자신을 선언한 객체의 parents 값을 출력한다.

($this->parents)

 

그런데 Child class는 parents라는 멤버 변수를 가지지 않는 데 어떻게 에러없이 내용이 출력된 것일까?

상속이라는 개념은 위에서 말했듯이 부모 클래스의 멤버 변수와 메서드를 모두 전달받는다. 

따라서 echoParents 함수로 출력하는 내용은 부모 클래스에서 정의된 parents 변수를 출력하는 것이다.

 

그렇기 때문에 자식 클래스에서 따로 정의하지 않아도 아무런 이상이 없는 것!

 

 

하지만 부모 클래스에서 변수 parents를 접근 제어자 private로 선언한다면 결과가 어떻게 달라질까?

public에서 private로 접근 제어자를 바꾸고 Child class를 확인해보면 

 

 

정의되지 않은 property라고 문구가 드는 걸 볼 수 있다.

이렇듯 상속받는 경우라도 private로 정의한 변수와 함수는 자식 클래스에서 접근할 수 없다. 

 

 

그렇다면 private로 선언된 변수는 어떻게 사용하라는 말인지 의문이 생길 수 있다.

접근 제어자 private는 메서드 내에서만 접근이 가능하다는 정의대로 

마지막 줄처럼 클래스 외부에서 접근하는 경우에는 에러가 발생하지만

클래스 내부에서 $this를 활용해 private로 정의된 변수에 접근하는 함수를 따로 만들어 사용하는 건 가능하다. 

 

결과로도 볼 수 있듯이 함수를 호출해 그 함수가 멤버 변수에 접근하는 방식은 가능하지만 

직접 private로 정의된 멤버 변수에 접근하는 건 에러를 발생시킨다. 

 

 


Step 2 :: Override 

위에서 살펴본 상속과 관련하여 오버라이드 라는 개념이 존재한다. 

오버라이드란 부모 클래스에서 정의한 메서드를 상속받은 자식 클래스가 알맞게 재정의하는 것을 말한다.

 

부모 클래스에게 물러받은 모든 값을 있는 그대로 사용할 순 없기 때문에 필요에 따라 자식 클래스에 알맞게

내용을 고쳐 쓰는 개념이다.

<?php
declare(strict_types=1);

class Parents {
    public string $txt = "parent class's variable<br/>";

    public function name(): string {
        return "{$this->txt} parent method<br/>";
    }
}

class Child extends Parents {
    public string $txt ="chile class's variable<br/>";

    public function name(): string {
        return "{$this->txt} child method<br/>";
    }
}

$parents = new Parents();
$child = new Child();

echo $parents->name();
echo $child->name();

Parents class를 상속받기 위해 extends keyword를 사용했다.

Parents class 내에 있는 name 함수는 변수 txt 값을 출력하고 "parent method" 문구를 출력한다.

 

Child class는 Parents class를 상속받았지만 자신에게 알맞게 변수 txt 값과 name 함수를 수정했다.

이를 오버라이딩이라고 하며 더 자세히는 property overriding & method overrideing이라 한다. 

 

 

PHP 8.1버전부터 읽기 전용 속성을 사용하게 되면서 오버라이드와 관련하여 주의할 점이 있다.

읽기 전용 속성은 readonly keyword로 정의할 수 있으며

<?php
class Example {
    public readonly string $str;

    public function say(string $str) {
        $this->str = $str;
    }
}

$str = "hello world";
$example = new Example();
$example->say(str: "hello world");
$example->say(str: "php");

readonly로 정의된 변수는 딱 한 번만 초기화할 수 있다. 

 

 

밑에 두 줄을 보면 str 변수로 hello world & php라는 인수를 각각 전달하여 say 함수를 호출하는 데

결과를 먼저 보자면 

첫 번째 say 함수 호출은 성공적으로 수행되지만 두 번째 say 함수 호출에서 문제가 발생한다.

readonly property를 수정할 수 없다고 문구에서 말해주고 있다.

 

즉 readonly로 정의된 str은 값이 없던 상태에서 최초 1번 값을 할당받고 나면 수정이 불가능하다는 것이다.

그렇기 때문에 readonly로 정의된 변수가 있다면 상속하는 과정에서 오버라이딩할 수 없다는 부분을 주의해야 한다. 

'PHP' 카테고리의 다른 글

php 객체 지향 프로그램 (5)  (0) 2023.07.18
php 객체 지향 프로그램 (4)  (0) 2023.07.16
php 객체 지향 프로그램 (2)  (0) 2023.07.12
php 객체 지향 프로그램 (1)  (0) 2023.07.10
php 함수 (3)  (0) 2023.07.06
Comments