추상 클래스
추상 클래스와 추상 메서드
추상 클래스 : 하나 이상의 추상 메서드를 포함하는 클래스다.
추상 메서드 : 선언되었지만 코드에서 구현되지 않는 메서드다.
추상 클래스와 메서드는 부모 클래스에 명명 된 메서드가 있지만 작업을 채우기 위해 자식 클래스가 필요한 경우다.
추상 클래스 또는 메소드는 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 DoeMrs. 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 DoeDear Mrs. Jane Doe
참고
W3C School - PHP OOP - Abstract Classes
W3C School - PHP Tryit Editor