PHP OOP에서의 추상 메서드

추상 클래스는 추상 메서드도 포함할 수 있습니다. 이러한 메서드는 구현을 가져서는 안 되며, 하위 클래스가 이러한 메서드를 가져야 한다는 것을 지정하기 위해 필요합니다. 그리고 이러한 메서드의 실제 구현은 이미 하위 클래스의 과제입니다.

메서드를 추상적으로 선언하려면, 선언 시 키워드 abstract를 작성해야 합니다.

실제로 시도해 봅시다. User 클래스의 모든 하위 클래스가 increaseRevenue 메서드를 가져야 한다고 가정해 보겠습니다.

이 메서드는 사용자의 현재 수입을 가져와 매개변수로 전달된 특정 금액만큼 증가시켜야 합니다.

User 클래스 자체는 하위 클래스가 정확히 어떤 수입을 얻을지 알지 못합니다. 직원에게는 급여이고 학생에게는 장학금이기 때문입니다. 따라서 각 하위 클래스는 이 메서드를 자신의 방식으로 구현할 것입니다.

여기서 요점은 User 클래스의 추상 메서드가 프로그래머로 하여금 하위 클래스에서 이 메서드를 구현하도록 강제한다는 것입니다. 그렇지 않으면 PHP가 오류를 발생시킵니다. 따라서 당신이나 당신의 코드로 작업하는 다른 프로그래머는 하위 클래스에서 필요한 메서드를 구현하는 것을 절대 잊을 수 없습니다.

자, 실제로 시도해 봅시다. User 클래스에 추상 메서드 increaseRevenue를 추가해 보겠습니다.

User.php<?php
  abstract class User
  {
    private $name;
    
    public function getName()
    {
      return $this->name;
    }
    
    public function setName($name)
    {
      $this->name = $name;
    }
    
    // 본문이 없는 추상 메서드:
    abstract public function increaseRevenue($value);
  }
?>

우리의 Employee 클래스는 일단 변경 없이 그대로 두겠습니다. 이 경우, Employee 클래스의 객체를 생성하지 않고 단지 클래스를 정의하는 코드를 실행하더라도 PHP는 오류를 발생시킬 것입니다.

이제 Employee 클래스에서 increaseRevenue 메서드의 구현을 작성해 보겠습니다.

Employee.php<?php
  class Employee extends User
  {
    private $salary;
    
    public function getSalary()
    {
      return $this->salary;
    }
    
    public function setSalary($salary)
    {
      $this->salary = $salary;
    }
    
    // 메서드 구현을 작성합니다:
    public function increaseRevenue($value)
    {
      $this->salary = $this->salary + $value;
    }
  }
?>

우리 클래스의 동작을 확인해 보겠습니다.

index.php<?php
  $employee = new Employee;
  $employee->setName('john');
  $employee->setSalary(1000);
  $employee->increaseRevenue(100);
  
  echo $employee->getSalary();
?>

이제 Student 클래스에서도 increaseRevenue 메서드를 구현해 보겠습니다. 이제 우리 메서드는 장학금을 증가시킬 것입니다.

Student.php<?php
  class Student extends User
  {
    private $scholarship; // 장학금
    
    public function getScholarship()
    {
      return $this->scholarship;
    }
    
    public function setScholarship($scholarship)
    {
      $this->scholarship = $scholarship;
    }
    
    // 메서드는 장학금을 증가시킵니다:
    public function increaseRevenue($value)
    {
      $this->scholarship = $this->scholarship + $value;
    }
  }
?>
Задание 1

당신의 User 클래스에 동일한 추상 메서드 increaseRevenue를 추가하세요. Employee 및 Student 클래스에서 이 메서드의 구현을 작성하세요.

Задание 2

Figure 클래스에서 도형의 넓이와 둘레를 구하기 위한 추상 메서드를 만드세요.