본문 바로가기
PHP

[PHP] 상속(extends)을 사용하기

by teamnova 2025. 9. 15.
728x90

PHP로 객체 지향 프로그래밍을 하다보면 비슷한 기능과 속성을 가진 클래스를 만들어야 할 때가 있습니다.

이번 예제는 강아지 클래스, 고양이 클래스 만들고 속성과 행동을 만들어 보겟습니다.

 

공통의 기능을 수정해야 할 때 관련된 클래스를 일일이 수정하는 불편함을 줄여줍니다.

 

그럼 상속은 무엇일까요?

부모 클래스의 속성, 행동을 자식 클래스가 물려받아 사용 할 수 있게 하는 기능입니다.

자식클래슨느 부모의 모든 것을 물려받아 자신만의 새로운 기능을 추가하거나 물려받은 기능을 자신에게 맞게 재정의(오버라이딩)을 할 수도 있습니다.

 

예제코드

<?php
class Animal
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function cry()
    {
        echo "{$this->name} is crying with an unknown sound.<br>";
    }

    public function eat()
    {
        echo "{$this->name} is eating.<br>";
    }
}

class Dog extends Animal
{
  // 부모의 cry() 메소드를 재정의 (오버라이딩)
    public function cry()
    {
        echo "{$this->name} is barking! 멍멍!<br>";
    }
      // 부모의 eat() 메소드를 확장
    public function eat()
    {
        parent::eat(); // 먼저 부모의 eat() 메소드를 그대로 실행
        echo "기분이 좋은지 꼬리를 흔듭니다!!<br>"; // 그리고 자신만의 기능을 추가
    }
}

class Cat extends Animal
{
   // 부모의 cry() 메소드를 재정의 (오버라이딩)
    public function cry()
    {
        echo "{$this->name} is meowing! 야옹!<br>";
    }
}


// 위 클래스 코드 아래에 추가
$dog = new Dog("바둑이");
$cat = new Cat("나비");

$dog->cry(); // Animal 클래스의 cry() 메소드 호출
$dog->eat(); // Animal 클래스의 eat() 메소드 호출

$cat->cry(); // Animal 클래스의 cry() 메소드 호출
$cat->eat(); // Animal 클래스의 eat() 메소드 호출
?>


 

시연화면

이 부분에서 부모 클래스에서 울다의 행동(메서드)를 다시 재정의 했습니다.

// 부모의 cry() 메소드를 재정의 (오버라이딩)
    public function cry()
    {
        echo "{$this->name} is barking! 멍멍!<br>";
    }
   // 부모의 cry() 메소드를 재정의 (오버라이딩)
    public function cry()
    {
        echo "{$this->name} is meowing! 야옹!<br>";
    }

 

이 부분에서는 부모의 원래 기능을 덮어쓰는 대신 확장을 한 부분입니다. 강아지는 다른 동물처럼 먹기도하지만 특별히 꼬리를 흔드는 행동을 추가한것 입니다.

      // 부모의 eat() 메소드를 확장
    public function eat()
    {
        parent::eat(); // 먼저 부모의 eat() 메소드를 그대로 실행
        echo "기분이 좋은지 꼬리를 흔듭니다!!<br>"; // 그리고 자신만의 기능을 추가
    }

 

parent::eat()를 통해 부모의 기능을 그대로 실행하고, 그 뒤에 자식만의 새로운 기능을 덧붙였습니다.
이 parent::는 특히 부모 클래스의 생성자(__construct)를 호출할 때 사용됩니다.