개요
PHP에서 final 키워드는 클래스의 인스턴스 메서드 정의에 사용될 경우, 해당 메서드가 자식 클래스에서 재정의(오버라이딩)되는 것을 방지합니다. 마찬가지로 클래스 자체의 정의에 final을 사용하면 그 클래스는 더 이상 확장(상속)될 수 없습니다.
이러한 특성은 라이브러리나 프레임워크를 설계할 때 핵심 로직이 의도치 않게 변경되는 것을 막고, 코드의 안정성과 일관성을 유지하는 데 매우 유용합니다.
문법
final class myclass {}
class myclass{
final function mymethod(){}
}final은 위와 같이 클래스 선언부 앞에 붙여 전체 클래스를 상속 불가능하게 만들거나, 메서드 선언부 앞에 붙여 해당 메서드만 오버라이딩을 금지할 수 있습니다.
final 메서드 예제
다음 예제에서는 부모 클래스에서 final로 선언된 메서드를 자식 클래스에서 재정의하려고 시도합니다. 이 경우 PHP는 치명적인 오류(Fatal Error)를 발생시킵니다.
예제 코드
<?php
class parentclass{
final function test(){
echo "final method in parent class";
}
}
class childclass extends parentclass{
function test(){
echo "overriding final method in parent class";
}
}
$obj=new childclass();
$obj->test();
?>실행 결과
코드를 실행하면 다음과 같은 오류 메시지가 출력됩니다.
PHP Fatal error: Cannot override final method parentclass::test() in line 16
오류 메시지에서 알 수 있듯이, final로 선언된 parentclass::test() 메서드는 자식 클래스에서 재정의할 수 없습니다.
final 클래스 예제
final 키워드가 클래스 자체에 적용되면 해당 클래스는 상속이 불가능합니다. 아래 예제를 통해 확인해 보겠습니다.
예제 코드
<?php
final class parentclass{
function test(){
echo "method in final parent class";
}
}
class childclass extends parentclass{
function test(){
echo "overriding method in parent class";
}
}
$obj=new childclass();
$obj->test();
?>실행 결과
final 클래스를 상속하려고 하면 다음과 같은 오류 메시지가 출력됩니다.
PHP Fatal error: Class childclass may not inherit from final class (parentclass) in line 16
즉, final로 선언된 parentclass는 어떤 클래스도 이를 상속받아 확장할 수 없습니다.
정리
- final 메서드: 자식 클래스에서 해당 메서드의 오버라이딩을 금지합니다.
- final 클래스: 클래스 전체의 상속 및 확장을 금지합니다.
- 두 경우 모두 규칙을 위반하면 PHP Fatal error가 발생하여 스크립트 실행이 중단됩니다.
final 키워드를 적절히 활용하면 클래스 설계 의도를 명확히 하고, 외부에서 핵심 동작을 임의로 변경하는 것을 사전에 차단할 수 있습니다.