PHP에서 final 키워드는 메서드와 클래스에 사용됩니다. 메서드에 final을 선언하면 해당 메서드를 자식 클래스에서 오버라이딩(재정의)할 수 없고, 클래스에 final을 선언하면 그 클래스는 상속될 수 없습니다.
이 키워드는 코드의 의도를 명확히 하고, 중요한 로직이 실수로 변경되는 것을 방지하는 데 유용합니다.
예제 1 – final 메서드 사용하기
아래 예제에서는 기본(Base) 클래스의 display() 메서드에 final을 선언했습니다. 반면 demo() 메서드는 final이 아니므로 파생(Derived) 클래스에서 자유롭게 재정의할 수 있습니다.
<?php
class Base {
final function display() {
echo "Base class function declared final!";
}
function demo() {
echo "Base class function!";
}
}
class Derived extends Base {
function demo() {
echo "Derived class function!";
}
}
$ob = new Derived;
$ob->demo();
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다. final로 선언되지 않은 demo() 메서드는 정상적으로 재정의되어 실행됩니다.
Derived class function!
예제 2 – final 클래스 사용하기
이번에는 클래스 자체에 final을 선언한 예제입니다. final 클래스는 상속이 불가능하기 때문에, 아래처럼 파생 클래스를 만들려고 하면 치명적인 오류(Fatal Error)가 발생합니다.
<?php
final class Base {
final function display() {
echo "Base class function declared final!";
}
function demo() {
echo "Base class function!";
}
}
class Derived extends Base {
function demo() {
echo "Derived class function!";
}
}
$ob = new Derived;
$ob->demo();
?>출력 결과
final로 선언된 기본 클래스를 상속하려고 시도했기 때문에 다음과 같은 오류가 발생합니다.
PHP Fatal error: Class Derived may not inherit from final class (Base) in /home/cg/root/6985034/main.php on line 19
final 키워드를 사용해야 하는 이유
- 안정성 확보: 핵심 비즈니스 로직이나 보안 관련 메서드가 자식 클래스에서 임의로 변경되는 것을 막을 수 있습니다.
- 설계 의도 명확화: 해당 클래스나 메서드가 더 이상 확장·변경되지 않는다는 것을 개발자에게 명확하게 알려줍니다.
- 불변 객체 설계: final 클래스는 주로 유틸리티 클래스나 설정 클래스처럼 한 번 정의되면 변하지 않아야 하는 구조에 적합합니다.
단, 남용하면 코드의 유연성과 테스트 용이성이 떨어질 수 있으므로, 정말로 변경을 허용하지 않아야 하는 경우에만 신중하게 사용하는 것이 좋습니다.