Menu
Coddy logo textTech

Private 및 Protected 프로퍼티

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

지금까지 우리는 어디서나 접근할 수 있는 public 속성을 사용해 왔습니다. 하지만 때로는 데이터를 보호하기 위해 접근을 제한해야 할 필요가 있습니다. PHP는 두 가지 추가적인 가시성 제한자(visibility modifiers)인 privateprotected를 제공합니다.

private 프로퍼티는 해당 프로퍼티를 정의한 클래스 내부에서만 접근할 수 있습니다:

<?php
class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
echo $account->getBalance();

출력:

100

클래스 외부에서 $account->balance에 직접 접근하려고 하면 오류가 발생합니다. 이는 deposit 메서드를 거치지 않고 잔액이 변경되는 것을 방지합니다.

protected 속성은 비슷하게 작동하지만, 부모 클래스를 상속받는 자식 클래스에서도 접근할 수 있습니다:

<?php
class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email;
    }
}

$admin = new Admin("admin@example.com");
echo $admin->showEmail();

출력:

admin@example.com

핵심 포인트: 정의된 클래스만 속성에 접근해야 할 때 private을 사용하세요. 자식 클래스도 접근이 필요할 때 protected를 사용하세요. 두 가지 모두 직접적인 외부 접근을 방지하여 객체의 내부 상태를 안전하게 유지합니다.

challenge icon

챌린지

쉬움

private 및 protected 속성을 사용하여 민감한 데이터를 보호하는 방법을 보여주는 안전한 직원 관리 시스템을 구축해 보겠습니다.

적절한 액세스 제어를 통해 직원 정보를 관리하기 위해 함께 작동하는 세 개의 파일을 생성합니다:

  • Employee.php — 모든 직원의 기본이 되는 Employee 클래스를 정의합니다. 이 클래스는 protected $name 속성(자식 클래스가 액세스할 수 있도록)과 private $salary 속성(이 클래스만 급여를 직접 수정할 수 있도록)을 가져야 합니다. 생성자는 이름과 급여를 받아 두 속성을 설정합니다. 이름을 반환하는 public getName() 메서드, 급여를 반환하는 public getSalary() 메서드, 그리고 주어진 금액만큼 급여를 인상하는 public giveRaise($amount) 메서드를 추가합니다.
  • Manager.phpEmployee를 상속받는 Manager 클래스를 정의합니다. 상단에 Employee 파일을 포함하세요. private $department 속성을 추가합니다. 생성자는 이름, 급여, 부서를 인자로 받아야 하며, 이름과 급여에 대해서는 부모 생성자를 호출한 다음 부서를 설정합니다. protected $name 속성에 직접 액세스하여 "[name] manages [department]"를 반환하는 getDetails() 메서드를 만듭니다. 또한 부서를 반환하는 getDepartment() 메서드를 추가합니다.
  • main.php — 두 클래스 파일을 모두 포함합니다. 이름이 "Sarah", 급여가 75000, 부서가 "Engineering"Manager를 생성합니다. getDetails()를 사용하여 매니저의 세부 정보를 출력합니다. 그런 다음 매니저에게 5000의 급여 인상을 제공하고 getSalary()를 사용하여 새 급여를 출력합니다. 각 출력은 별도의 줄에 있어야 합니다.

Manager 클래스가 protected $name 속성에는 직접 액세스할 수 있지만, private 급여에 액세스하려면 getSalary() 메서드를 사용해야 한다는 점에 주목하세요. 이는 protected와 private 가시성 사이의 핵심적인 차이점을 보여줍니다. protected는 자식 클래스의 액세스를 허용하는 반면, private은 데이터를 진정으로 숨겨진 상태로 유지합니다.

치트 시트

PHP는 클래스 속성에 대해 세 가지 가시성 제어자(visibility modifiers)를 제공합니다:

  • public — 어디서나 접근 가능
  • private — 정의된 클래스 내에서만 접근 가능
  • protected — 정의된 클래스 및 자식 클래스 내에서 접근 가능

Private 속성:

class BankAccount {
    private $balance = 0;
    
    public function deposit($amount) {
        $this->balance += $amount;
    }
    
    public function getBalance() {
        return $this->balance;
    }
}

Private 속성은 클래스 외부에서 직접 접근할 수 없습니다. 이들과 상호작용하려면 public 메서드를 사용하세요.

Protected 속성:

class User {
    protected $email;
    
    public function __construct($email) {
        $this->email = $email;
    }
}

class Admin extends User {
    public function showEmail() {
        return $this->email; // 자식 클래스는 protected 속성에 접근할 수 있습니다
    }
}

Protected 속성은 부모 클래스를 확장하는 자식 클래스에서 접근할 수 있습니다.

사용 시기:

  • 정의된 클래스만 속성에 접근해야 할 때 private을 사용합니다
  • 자식 클래스도 접근이 필요할 때 protected를 사용합니다
  • 둘 다 직접적인 외부 접근을 방지하여 객체의 내부 상태를 보호합니다

직접 해보기

<?php
require_once 'Employee.php';
require_once 'Manager.php';

// TODO: 이름이 "Sarah"이고 급여가 75000이며 부서가 "Engineering"인 Manager를 생성하세요.

// TODO: getDetails()를 사용하여 매니저의 상세 정보를 출력하세요.

// TODO: 매니저에게 5000의 급여 인상을 적용하세요.

// TODO: getSalary()를 사용하여 새로운 급여를 출력하세요.
?>
quiz icon실력 점검

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

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