Menu
Coddy logo textTech

final 키워드

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 24번째.

상속과 메서드 재정의는 유연성을 제공하지만, 때로는 특정 클래스나 메서드가 변경되지 않도록 해야 합니다. final 키워드는 코드를 고정하여 특정 구현을 자식 클래스가 변경할 수 없도록 합니다.

메서드를 final로 표시하면 어떤 자식 클래스도 이를 재정의할 수 없습니다:

<?php
class BankAccount {
    protected $balance;
    
    public function __construct($balance) {
        $this->balance = $balance;
    }
    
    final public function getAccountId() {
        return "ACC-" . spl_object_id($this);
    }
}

class SavingsAccount extends BankAccount {
    public function addInterest() {
        return $this->balance * 0.05;
    }
}

$account = new SavingsAccount(1000);
echo $account->getAccountId();

출력:

ACC-1

getAccountId() method는 SavingsAccount 또는 다른 하위 class에서 재정의할 수 없습니다. 이는 모든 account 유형에서 일관되게 유지되어야 하는 중요한 기능을 보호합니다.

상속을 방지하기 위해 전체 클래스를 final로 표시할 수도 있습니다:

<?php
final class SecurityManager {
    public function authenticate($user) {
        return "Authenticating $user";
    }
}

$security = new SecurityManager();
echo $security->authenticate("admin");

출력:

Authenticating admin

어떤 class도 SecurityManager를 extend할 수 없습니다. 이는 보안에 민감한 class에 유용하거나, class 설계가 완료되어 수정해서는 안 될 때 유용합니다.

핵심 요점: 상속은 허용하면서 오버라이딩을 방지하려면 메서드에 final을 사용하고, 상속을 완전히 방지하려면 클래스에 사용하세요. 이는 설계된 대로 정확히 작동해야 하는 중요한 코드를 보호하는 도구입니다.

challenge icon

챌린지

쉬움

final 키워드가 자식 클래스에 의해 수정되지 않도록 중요한 기능을 보호하는 문서 관리 시스템을 만들어 보겠습니다.

서로 함께 작동하여 다양한 문서 유형을 관리하면서 특정 보안 기능이 변경되지 않도록 보장하는 세 개의 파일을 만듭니다:

  • Document.php: 모든 문서의 기반 역할을 하는 Document class를 정의합니다. public $title property와 protected $author property를 가져야 합니다. constructor는 title과 author를 모두 accepts합니다. "Signed by: [author]"를 returns하는 getSignature()라는 final method를 포함합니다. 이 보안 기능은 자식 class에 의해 절대 변경되어서는 안 됩니다. 또한 "Document: [title]"을 returns하는 일반 getContent() method도 추가합니다.
  • Report.php: Documentextends하는 Report class를 정의합니다. 파일의 맨 위에서 Document 파일을 포함합니다. 이 class는 $department property를 추가합니다. constructor는 title, author, department를 accepts해야 합니다. 처음 두 값에는 parent::__construct()를 사용한 다음 department를 설정합니다. getContent() method를 override하여 "Report: [title] ([department])"를 returns합니다. Report class는 final getSignature() method를 상속하지만 이를 변경할 수는 없습니다.
  • main.php: Report 파일을 포함합니다. 세 가지 입력, 즉 문서 제목, author 이름, department를 받습니다. 이 값들로 Report object를 Create합니다. 첫 번째 줄에 getContent()의 result를 Print한 다음, 두 번째 줄에 getSignature()의 result를 Print합니다.

이 challenge는 final method가 중요한 기능을 어떻게 보호하는지 보여 줍니다. 서명 생성은 모든 문서 유형에서 일관되게 유지되는 반면, getContent()와 같은 다른 method는 각 자식 class에서 사용자 지정할 수 있습니다. Report는 콘텐츠가 표시되는 방식을 변경할 수 있지만, 서명 형식은 부모 class에 고정되어 있습니다.

직접 해보기

<?php
require_once 'Report.php';

// 입력 읽기
$title = trim(fgets(STDIN));
$author = trim(fgets(STDIN));
$department = trim(fgets(STDIN));

// TODO: 입력 값으로 Report 객체 생성

// TODO: getContent()의 결과 출력

// TODO: getSignature()의 결과 출력
?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러