Public, Protected, Private
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 38번째.
캡슐화 장에 오신 것을 환영합니다! 캡슐화는 class의 내부 데이터에 대한 access를 제어하는 것입니다. PHP는 properties와 methods에 어디에서 access할 수 있는지를 결정하는 세 가지 access modifier를 제공합니다: public, protected, private.
각 수정자가 작동하는 방식은 다음과 같습니다:
<?php
class BankAccount {
public $accountHolder; // 어디서나 접근 가능
protected $accountNumber; // 이 클래스와 자식 클래스에서 접근 가능
private $balance; // 이 클래스에서만 접근 가능
public function __construct($holder, $number, $balance) {
$this->accountHolder = $holder;
$this->accountNumber = $number;
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount("John", "12345", 1000);
echo $account->accountHolder . "\n"; // 작동함 - public
echo $account->getBalance(); // 작동함 - public 메서드
출력:
John
1000$account->balance에 직접 access하려고 하면 private이기 때문에 오류가 발생합니다. class 계층 외부에서 $account->accountNumber에 access하는 경우에도 마찬가지입니다. 이러한 보호 기능을 통해 민감한 데이터는 제어된 method를 통해서만 수정할 수 있습니다.
| 수정자 | 동일한 Class | 자식 Class | 외부 |
|---|---|---|---|
public | 예 | 예 | 예 |
protected | 예 | 예 | 아니요 |
private | 예 | 아니요 | 아니요 |
핵심 요점: 직접 access해서는 안 되는 내부 데이터에는 private를, child classes에 필요한 데이터에는 protected를 사용하고, 안전한 외부 access에만 public을 사용하세요.
챌린지
쉬움접근 제어자가 민감한 데이터를 어떻게 보호하는지 보여 주는 안전한 직원 관리 시스템을 만들어 보겠습니다. 코드가 실행되는 위치에 따라 정보에 접근할 수 있는 수준이 달라지는 클래스 계층 구조를 만들 것입니다. 즉, 클래스 내부, child 클래스 내부 또는 외부에서 접근할 수 있습니다.
코드를 세 개의 파일로 구성합니다:
Employee.php: 적절한 가시성 수준으로 직원 데이터를 관리하는Employee클래스를 Create합니다. 클래스에는 다음이 있어야 합니다:- 직원의 이름을 위한
publicproperty$name(누구나 볼 수 있어 안전함) - 내부 ID를 위한
protectedproperty$employeeId(child classes에 필요함) - 민감한 급여 정보를 위한
privateproperty$salary(only 이 클래스만 직접 access해야 함)
getSalary()를 추가합니다. 이것이 protected 데이터에 access하는 제어된 방법입니다. 또한"[name] works here"를 반환하는 public methodgetPublicInfo()도 추가합니다.- 직원의 이름을 위한
Manager.php:Employee를 extends하는Manager클래스를 Create합니다. Employee 파일을 포함합니다. constructor는 name, employeeId, salary, department name을 받아야 합니다. first 세 값으로 parent constructor를 Call한 다음 department를 private property에 저장합니다."Manager [name] (ID: [employeeId]) leads [department]"를 반환하는 public methodgetTeamInfo()를 추가합니다. child class가 protected$employeeId에 access할 수 있지만, private salary에 access하려면getSalary()가 필요하다는 점에 유의하세요.main.php: Manager 파일을 포함합니다. 네 개의 inputs를 받습니다: name, employee ID, salary (문자열로 받은 후 정수로 변환), department name입니다. 이 값들로Managerinstance를 Create합니다. 세 줄을 Print합니다:- 직접 access한 manager의 name (public property)
getTeamInfo()를 calling한 결과getSalary()를 calling한 결과
이 challenge는 encapsulation이 실제로 작동하는 모습을 보여 줍니다. name은 자유롭게 access할 수 있고, employee ID는 protected visibility를 통해 child classes와 공유되며, salary는 parent class 안에 잠긴 상태로 유지됩니다. 즉, 제어된 public method를 통해서만 access할 수 있습니다.
직접 해보기
<?php
require_once 'Manager.php';
// 입력 읽기
$name = trim(fgets(STDIN));
$employeeId = trim(fgets(STDIN));
$salary = intval(trim(fgets(STDIN)));
$department = trim(fgets(STDIN));
// TODO: 입력 값으로 Manager 인스턴스 생성
// TODO: 매니저의 이름 출력 (public 속성으로 직접 접근)
// TODO: getTeamInfo() 호출 결과 출력
// TODO: getSalary() 호출 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러