여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. PHP - 기초 - OOP 추상 클래스
PHP – 기초 – OOP 추상 클래스
2년전 작성
9개월전 수정

추상 클래스

추상 클래스와 추상 메서드

추상 클래스 : 하나 이상의 추상 메서드를 포함하는 클래스다.

추상 메서드 : 선언되었지만 코드에서 구현되지 않는 메서드다.

추상 클래스와 메서드는 부모 클래스에 명명 된 메서드가 있지만 작업을 채우기 위해 자식 클래스가 필요한 경우다.

추상 클래스 또는 메소드는 abstract 키워드로 정의된다.

abstract class ParentClass {
abstract public function someMethod1();
abstract public function someMethod2($name, $color);
abstract public function someMethod3() : string;
}

이런식으로 입력한다.

추상 클래스에서 상속할 때 자식 클래스 메서드는 동일한 이름과 동일하거나 덜 제한된 액세스 수정자로 정의되어야한다.
따라서 추상 메서드가 보호됨으로 정의되는 경우 자식 클래스 메서드는 보호되거나 공개된 것으로 정의되어야 하지만 비공개는 정의되지 않아야한다.
또한 필수 인수의 유형과 개수는 동일해야한다.
그러나 자식 클래스에는 선택적 인수가 추가로 있을 수 있다.

자식 클래스가 추상 클래스에서 상속 될 때 다음과 같은 규칙이 있다.

  • 자식 클래스 메서드는 동일한 이름으로 정의되어야 하며 부모 추상 메서드를 다시 선언한다.
  • 자식 클래스 메서드는 동일하거나 덜 제한된 액세스 수정자로 정의되어야한다.
  • 필요한 인수의 수는 동일해야 합니다. 그러나 자식 클래스에는 선택적 인수가 추가로 포함될 수 있다.
예시

예시를 통해 공부해보자.

PHP
<?php
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string; 
}

class Audi extends Car {
  public function intro() : string {
    return "Choose German quality! I'm an $this->name!"; 
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Proud to be Swedish! I'm a $this->name!"; 
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "French extravagance! I'm a $this->name!"; 
  }
}

$audi = new audi("Audi");
echo $audi->intro();
echo "
"; $volvo = new volvo("Volvo"); echo $volvo->intro(); echo "
"; $citroen = new citroen("Citroen"); echo $citroen->intro(); ?>
기본 예시
Choose German quality! I’m an Audi!
Proud to be Swedish! I’m a Volvo!
French extravagance! I’m a Citroen!
 
Audi, Volvo 및 Citroen 클래스는 Car 클래스에서 상속된다.
즉, Audi, Volvo 및 Citroen 클래스는 상속으로 인해 Public $name 속성과 Car 클래스의 public __construct() 메서드를 사용할 수 있다.

그러나 intro() 는 모든 자식 클래스에서 정의되어야하는 추상 메소드이며 문자열을 반환해야한다.

더 추상적 인 클래스

abstract 메서드에 인수가있는 또 다른 예
PHP
<?php
abstract class ParentClass {
abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
public function prefixName($name) {
if ($name == "John Doe") {
$prefix = "Mr.";
} elseif ($name == "Jane Doe") {
$prefix = "Mrs.";
} else {
$prefix = "";
}
return "{$prefix} {$name}";
}
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "
"; echo $class->prefixName("Jane Doe"); ?>
기본 예시
Mr. John Doe
Mrs. Jane Doe
추상 메서드에 정의되지 않은 두 개의 선택적 인수가 있는 또 다른 예
PHP
<?php
abstract class ParentClass {
abstract protected function prefixName($name);
}

class ChildClass extends ParentClass {
public function prefixName($name, $separator = ".", $greet = "Dear") {
if ($name == "John Doe") {
$prefix = "Mr";
} elseif ($name == "Jane Doe") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$greet} {$prefix}{$separator} {$name}";
}
}

$class = new ChildClass;
echo $class->prefixName("John Doe");
echo "
"; echo $class->prefixName("Jane Doe"); ?>
기본 예시
Dear Mr. John Doe
Dear Mrs. Jane Doe
참고

Mingg`s Diary
밍구
공부 목적 블로그