Menu

PHP 추상 클래스: 추상 메서드와 사용 시점

PHP 추상 클래스는 abstract class Name으로 선언하며 인스턴스를 만들 수 없습니다. 상속되기 위해 존재합니다. 속성, 생성자, 완성된 메서드를 담을 수 있고, 모든 자식 클래스가 구현해야 하는 본문 없는 abstract 메서드도 담을 수 있습니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

PHP 추상 클래스는 abstract class Name으로 선언하며 new로 만들 수 없습니다. 다른 클래스의 기반이 됩니다. 속성, 생성자, 완성된 메서드를 가질 수 있고, 모든 자식 클래스가 구현해야 하는 본문 없는 abstract 메서드도 가질 수 있습니다.

describe()는 Shape에 한 번 작성되고, 각 자식이 제공하는 area()를 호출합니다. 추상 클래스가 메서드의 존재를 보장하므로 describe()는 그것에 기댈 수 있습니다.

추상 클래스는 new로 만들 수 없다

추상 클래스는 일부러 미완성입니다. Shape::area()에는 본문이 없으므로 그냥 Shape 객체는 실행할 것이 없습니다. PHP는 만들기를 거부하고 Error를 던집니다.

추상 메서드의 규칙

추상 메서드는 본문 대신 시그니처와 세미콜론을 가집니다. 각 자식은 호환되는 시그니처와 같거나 더 넓은 접근 제어로 구현해야 합니다. abstract protected 메서드는 자식에서 protected나 public이 될 수 있지만 private은 될 수 없습니다. 추상 메서드가 하나라도 있는 클래스는 그 자체가 abstract로 선언되어야 합니다.

자식이 추상 메서드를 빠뜨리면, 자식도 abstract로 선언해 그 메서드를 자신의 자식에게 맡기지 않는 한, 스크립트는 아무것도 실행되기 전에 멈춥니다.

PHP Fatal error:  Class Square contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Shape::area) in /home/index.php on line 3

템플릿 메서드 패턴

추상 클래스를 쓰는 가장 흔한 이유입니다. 고정된 단계의 순서 중 몇 단계만 다른 경우입니다. 기반 클래스가 final 메서드로 순서를 소유하고 자식이 단계를 채웁니다. 여기서는 같은 보고서가 일반 텍스트와 HTML 표로 실행됩니다.

실행하면 Page 탭에 일반 텍스트 버전 위로 HTML 표가 보입니다. open()과 close()에는 기본 본문이 있으므로 HtmlReport만 그것을 오버라이드하고, row()는 적절한 기본값이 없으므로 abstract입니다. render()를 final로 만들면 자식이 단계의 순서를 바꾸지 못합니다.

추상 클래스는 인터페이스를 구현할 수 있다

추상 클래스는 implements를 선언하고 인터페이스 메서드 일부를 자식에게 맡길 수 있습니다. 인터페이스(타입)와 기반 클래스(공유 코드)를 짝짓는 표준적인 방법입니다.

코드는 인터페이스 Cache를 타입 힌트로 쓰므로, 이미 다른 것을 상속해서 BaseCache를 상속할 수 없는 클래스도 Cache를 직접 구현할 수 있습니다.

추상 클래스를 쓸 때와 쓰지 말아야 할 때

가족의 클래스들이 속성, 생성자, 모두에게 같은 메서드처럼 실제 코드를 공유할 때 추상 클래스를 쓰세요. 기반에 추상 메서드밖에 없다면 그것은 변장한 인터페이스이며, 클래스는 인터페이스를 여러 개 구현할 수 있지만 클래스는 하나만 상속할 수 있으므로 인터페이스가 더 나은 선택입니다. 관련 없는 클래스 사이에 헬퍼 메서드 몇 개만 공유하고 싶다면 한 부모 밑으로 억지로 넣지 말고 트레이트를 쓰세요.

abstract class를 쓰기 전에 빠르게 확인해 보세요. 모든 자식이 정말 기반의 한 종류인가요(Circle은 Shape이다)? 솔직한 답이 "이것 중 하나다"가 아니라 "이것을 할 수 있다"라면 인터페이스를 쓰세요.

자주 묻는 질문

PHP의 추상 클래스는 무엇인가요?

abstract class Name으로 선언해 new로 만들 수 없는 클래스입니다. 다른 클래스의 기반이 됩니다. 속성, 생성자, 일반 메서드를 담을 수 있고, 각 자식 클래스가 구현해야 하는 abstract 메서드를 선언할 수 있습니다.

PHP의 추상 메서드는 무엇인가요?

abstract로 선언하고 본문이 없는 메서드입니다: abstract protected function render(array $rows): string;. 이를 담은 클래스는 그 자체가 abstract로 선언되어야 하고, 추상이 아닌 모든 자식 클래스는 호환되는 시그니처의 메서드를 정의해야 합니다.

PHP 추상 클래스에 생성자가 있을 수 있나요?

네. 추상 클래스에 new를 쓸 수는 없지만, 자식 클래스를 만들 때 그 생성자가 실행됩니다. 자식에 생성자가 없으면 자동으로, 아니면 parent::__construct(...)를 통해 실행됩니다.

PHP에서 추상 클래스의 인스턴스를 만들 수 있나요?

아니요. 추상 클래스에 new Shape()를 쓰면 Error를 던집니다: Cannot instantiate abstract class Shape. 대신 구체적인 자식 클래스의 객체를 만드세요. 예: new Circle(2).

PHP에서 추상 클래스는 언제 써야 하나요?

관련된 여러 클래스가 실제 코드(속성, 생성자, 공통 메서드)를 공유하고 몇 단계에서만 다를 때입니다. 공유 코드는 추상 클래스에 두고 다른 단계는 abstract로 선언하세요. 공유 코드가 없고 계약만 필요하다면 인터페이스를 쓰세요.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기