Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 추상 클래스(Abstract Class) 완벽 가이드 – 개념부터 활용까지


추상 클래스란 무엇인가?

객체 지향 프로그래밍(OOP)에서 추상 클래스(abstract class)란 직접 인스턴스화할 수 없는 클래스를 의미합니다. 즉, 추상 클래스로는 객체를 생성할 수 없습니다. PHP는 버전 5.0부터 추상 클래스 개념을 공식적으로 지원해 왔습니다.

abstract 키워드로 선언된 클래스가 추상 클래스가 됩니다. 또한, 추상 메서드를 하나 이상 포함하고 있는 클래스 역시 별도의 키워드 선언이 없더라도 자동으로 추상 클래스로 간주됩니다.

기본 문법

<?php
abstract class testclass{
    //
}
?>

이렇게 선언된 추상 클래스의 객체를 생성하려고 시도하면, PHP 파서는 다음과 같은 치명적인 오류(fatal error)를 발생시킵니다.

$a=new testclass();
PHP Fatal error: Uncaught Error: Cannot instantiate abstract class testclass

추상 메서드(Abstract Method)

추상 메서드는 접근 제한자, 매개변수, 반환 타입 등 시그니처(signature)만 선언할 뿐 실제 구현 내용은 갖지 않는 메서드입니다. 추상 클래스를 상속받는 자식 클래스는 반드시 모든 추상 메서드를 재정의(오버라이드)하여 구현을 제공해야 합니다.

이때 자식 클래스의 해당 메서드는 부모 클래스와 동일한 시그니처를 가져야 하며, 이 조건을 충족하지 못하면 PHP 파서가 예외를 발생시킵니다. 추상 클래스를 상속받아 모든 추상 메서드를 구현한 클래스는 비로소 인스턴스화가 가능해지는데, 이러한 클래스를 구체 클래스(concrete class)라고 부릅니다.

다음 예제에서 부모 클래스는 두 개의 추상 메서드를 선언했지만, 자식 클래스에서는 그중 하나(test1())만 재정의했습니다. 그 결과 아래와 같은 오류가 발생합니다.

예제

<?php
abstract class testclass{
    abstract function test1();
    abstract function hello();
}
class myclass extends testclass{
    function test1(){
        echo "Overrides parent test method";
    }
}
$a=new myclass();
?>

출력 결과

실행하면 다음과 같은 에러 메시지가 출력됩니다.

PHP Fatal error: Class myclass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (testclass::hello)

오류 메시지에서 알 수 있듯이, 구현되지 않은 추상 메서드가 남아 있다면 해당 클래스 자체를 abstract로 선언하거나, 나머지 메서드를 모두 구현해야 한다는 것입니다.

매개변수가 있는 추상 메서드

추상 메서드가 매개변수와 함께 정의되어 있다면, 자식 클래스에서 이를 재정의할 때 동일한 개수의 매개변수를 사용해야 합니다.

다음 예제에서 부모 클래스의 추상 메서드 hello()는 두 개의 매개변수를 가지고 있으며, 자식 클래스 역시 같은 이름의 함수를 두 개의 매개변수로 정의하여 정상적으로 구현하고 있습니다.

예제

<?php
abstract class testclass{
    abstract function hello($name, $age);
}
class myclass extends testclass{
    function hello($name, $age){
        echo "My name is $name and my age is $age";
    }
}
$a=new myclass();
$a->hello("Ravi",20);
?>

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

My name is Ravi and my age is 20

핵심 정리

  • 추상 클래스는 abstract 키워드로 선언하며, 직접 객체를 생성할 수 없습니다.
  • 추상 메서드를 하나라도 포함한 클래스는 반드시 추상 클래스로 선언해야 합니다.
  • 자식 클래스는 부모의 모든 추상 메서드를 동일한 시그니처로 재정의해야 하며, 그래야만 인스턴스화 가능한 구체 클래스가 됩니다.
  • 매개변수가 있는 추상 메서드를 재정의할 때는 매개변수의 개수와 구성을 일치시켜야 합니다.