Public, Protected, Private
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 38번째.
캡슐화(Encapsulation) 장에 오신 것을 환영합니다! 캡슐화는 클래스의 내부 데이터에 대한 접근을 제어하는 것에 관한 것입니다. PHP는 속성과 메서드에 접근할 수 있는 위치를 결정하는 세 가지 접근 제어자(access modifiers)를 제공합니다: 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에 직접 접근하려고 시도하면 private이기 때문에 오류가 발생합니다. 클래스 계층 구조 외부에서 $account->accountNumber에 접근하는 경우에도 동일하게 적용됩니다. 이러한 보호 조치는 민감한 데이터가 제어된 메서드를 통해서만 수정될 수 있도록 보장합니다.
| 제한자 | 동일 클래스 | 자식 클래스 | 외부 |
|---|---|---|---|
public | 예 | 예 | 예 |
protected | 예 | 예 | 아니요 |
private | 예 | 아니요 | 아니요 |
핵심 포인트: 직접 액세스해서는 안 되는 내부 데이터에는 private을 사용하고, 자식 클래스에 필요한 데이터에는 protected를 사용하며, 안전한 외부 액세스를 위해서만 public을 사용하세요.
챌린지
쉬움액세스 제어자(access modifiers)가 민감한 데이터를 어떻게 보호하는지 보여주는 보안 직원 관리 시스템을 구축해 보겠습니다. 클래스 내부, 자식 클래스, 또는 외부 등 코드가 실행되는 위치에 따라 정보의 접근 수준이 달라지는 클래스 계층 구조를 만들게 됩니다.
코드는 다음 세 개의 파일로 구성됩니다:
Employee.php— 적절한 가시성 수준으로 직원 데이터를 관리하는Employee클래스를 생성합니다. 클래스는 다음을 포함해야 합니다:- 직원 이름을 위한
public속성$name(누구나 볼 수 있음) - 내부 ID를 위한
protected속호성$employeeId(자식 클래스에서 필요함) - 민감한 급여 정보를 위한
private속성$salary(이 클래스에서만 직접 접근 가능)
getSalary()를 추가하세요. 이것이 보호된 데이터에 접근하는 제어된 방식입니다. 또한"[name] works here"를 반환하는 퍼블릭 메서드getPublicInfo()를 추가하세요.- 직원 이름을 위한
Manager.php—Employee를 상속받는Manager클래스를 생성합니다. Employee 파일을 포함(include)하세요. 생성자는 name, employeeId, salary, 그리고 department 이름을 받아야 합니다. 처음 세 개의 값으로 부모 생성자를 호출한 다음, 부서(department)를 프라이빗 속성에 저장하세요."Manager [name] (ID: [employeeId]) leads [department]"를 반환하는 퍼블릭 메서드getTeamInfo()를 추가하세요. 자식 클래스가 보호된$employeeId에는 접근할 수 있지만, 프라이빗 급여에 접근하려면getSalary()가 필요하다는 점에 유의하세요.main.php— Manager 파일을 포함하세요. 네 개의 입력값(이름, 직원 ID, 급여(정수로 변환할 문자열), 부서 이름)을 받게 됩니다. 이 값들로Manager인스턴스를 생성합니다. 다음 세 줄을 출력하세요:- 직접 접근한 매니저의 이름 (public 속성)
getTeamInfo()호출 결과getSalary()호출 결과
이 챌린지는 캡슐화(encapsulation)가 실제로 작동하는 모습을 보여줍니다. 이름은 자유롭게 접근 가능하고, 직원 ID는 protected 가시성을 통해 자식 클래스와 공유되며, 급여는 부모 클래스에 잠겨 있어 제어된 퍼블릭 메서드를 통해서만 접근할 수 있습니다.
치트 시트
PHP는 속성과 메서드에 접근할 수 있는 위치를 제어하기 위해 세 가지 접근 제어자(access modifiers)를 제공합니다:
| 제어자 | 동일 클래스 | 자식 클래스 | 외부 |
|---|---|---|---|
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; // 작동함 - public
echo $account->getBalance(); // 작동함 - public 메서드
권장 사항:
- 직접 접근해서는 안 되는 내부 데이터에는
private을 사용하세요. - 자식 클래스에서 필요한 데이터에는
protected를 사용하세요. - 안전한 외부 접근을 위해서만
public을 사용하세요.
직접 해보기
<?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() 호출 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션