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

PHP final 클래스와 final 메서드 완벽 정리: 상속과 오버라이딩 제어하기

final 키워드는 PHP5에서 객체 지향 프로그래밍(OOP) 개념과 함께 도입된 기능입니다. 이 키워드를 제대로 이해하려면 먼저 상속(Inheritance) 개념을 확실히 알고 있어야 합니다.

상속과 오버라이딩의 기본 개념

상속이란 하나의 클래스가 다른 클래스로부터 기능을 물려받는 것을 의미합니다. 상속받은 자식 클래스에서는 부모 클래스의 메서드를 오버라이딩(Overriding)하여 원래 동작을 자신만의 방식으로 대체할 수 있습니다.

하지만 경우에 따라 특정 클래스가 더 이상 상속되지 않도록 막거나, 특정 메서드가 오버라이딩되지 않도록 보호해야 할 필요가 생깁니다. 바로 이럴 때 final 키워드를 사용합니다. 클래스나 메서드 앞에 final을 붙이면, 누군가 final 클래스를 상속하거나 final 메서드를 재정의하려는 순간 PHP는 치명적인 오류(Fatal Error)를 발생시킵니다.

주의 사항

final 키워드는 메서드와 클래스에만 사용할 수 있습니다. 프로퍼티(멤버 변수)에는 적용할 수 없습니다.

예제 1: final 메서드 — 부모 클래스 메서드 오버라이딩 불가

아래 예제에서는 부모 클래스의 메서드를 오버라이딩할 수 없음을 보여줍니다.

<?php
class BaseClass {
    final function calculate($val1, $val2) {
        $sum = $val1 + $val2;
        echo "두 수의 합 = " . $sum;
    }
}

class ChildClass extends BaseClass {
    function calculate($x, $y) {
        $mult = $x * $y;
        echo "두 수의 곱 = " . $mult;
    }
}

$obj = new ChildClass();
$obj->calculate(10, 10);
?>

실행 결과

PHP Fatal error: Cannot override final method BaseClass::calculate()

코드 설명

위 예제에서 BaseClass는 부모 클래스이며, 그 안의 calculate 메서드가 final로 선언되어 있습니다. 이는 어떤 자식 클래스에서도 해당 메서드를 재정의할 수 없다는 의미입니다. 그럼에도 불구하고 ChildClasscalculate 메서드를 다시 정의하려고 시도했기 때문에 PHP는 치명적인 오류를 발생시킵니다. 즉, 부모 클래스의 final 메서드는 자식 클래스에서 재정의할 수 없습니다.

예제 2: final 클래스 — 클래스 상속 자체를 차단

이번에는 클래스 선언부 앞에 final 키워드를 붙인 경우를 살펴보겠습니다.

<?php
final class BaseClass {
    function printData($val1, $val2) {
        $add = $val1 + $val2;
        echo "두 수의 합 = " . $add;
    }
}

class Child extends BaseClass {
    function printData($val1, $val2) {
        $m = $val1 * $val2;
        echo "두 수의 곱 = " . $m;
    }
}

$obj = new Child();
$obj->printData(20, 20);
?>

실행 결과

PHP Fatal error: Class Child may not inherit from final class (BaseClass)

코드 설명

위 예제에서 BaseClassfinal로 선언된 클래스이므로 더 이상 상속(확장)될 수 없습니다. 그런데 Child 클래스가 BaseClass를 상속하려고 시도했기 때문에 PHP는 "Class Child may not inherit from final class (BaseClass)"라는 오류 메시지를 출력합니다. 즉, final 클래스는 어떠한 자식 클래스도 가질 수 없습니다.

정리

final 키워드는 코드의 의도를 명확히 하고, 중요한 로직이 의도치 않게 변경되는 것을 방지하는 강력한 도구입니다.

  • final 메서드: 자식 클래스에서 해당 메서드의 오버라이딩을 금지합니다.
  • final 클래스: 해당 클래스의 상속 자체를 금지합니다.
  • final은 메서드와 클래스에만 사용 가능하며, 프로퍼티에는 사용할 수 없습니다.
  • 규칙 위반 시 PHP는 치명적인 오류(Fatal Error)를 발생시킵니다.