PHP Access Modifiers
PHP 접근 제어자(Access Modifiers): 속성과 메서드의 가시성 제어
- *PHP 접근 제어자(Access Modifiers)**는 클래스 내의 속성과 메서드에 대한 접근 권한을 제어하는 중요한 개념입니다. 이를 통해 객체 지향 프로그래밍에서 **캡슐화(Encapsulation)**를 구현할 수 있으며, 데이터와 메서드의 접근성을 적절히 관리하여 클래스 내부의 구조를 보호할 수 있습니다.
PHP에서는 public
, private
,
protected
세 가지 접근 제어자를 지원하며, 각각의 접근 제어자는 클래스 속성과 메서드가 어디서 접근할 수 있는지를 결정합니다.
1. PHP 접근 제어자의 종류
public
: 모든 곳에서 접근 가능합니다. 클래스 내부, 외부, 그리고 상속받은 클래스에서도 접근할 수 있습니다.private
: 클래스 내부에서만 접근 가능합니다. 외부나 상속받은 클래스에서는 접근할 수 없습니다.protected
: 클래스 내부와 상속받은 클래스에서 접근 가능합니다. 클래스 외부에서는 접근할 수 없습니다.
2. public
접근 제어자
- *
public
*은 가장 넓은 범위의 접근 권한을 제공합니다. 클래스 외부에서 속성이나 메서드에 직접 접근할 수 있으며, 모든 코드에서 이 속성과 메서드를 사용할 수 있습니다.
2.1 public
예제
<?php
class Car {
public $color; // 공개 속성
public $model;
public function setColor($color) {
$this->color = $color;
}
public function drive() {
return "The $this->color $this->model is driving.";
}
}
$car = new Car();
$car->model = "Toyota"; // 외부에서 직접 속성에 접근 가능
$car->setColor("red");
echo $car->drive(); // 결과: The red Toyota is driving.
?>
설명:
public
접근 제어자는 클래스 외부에서 속성과 메서드에 자유롭게 접근할 수 있습니다.Car
클래스의model
과color
속성은 외부에서 직접 접근 및 수정이 가능합니다.
3. private
접근 제어자
private
접근 제어자는 클래스 내부에서만 접근할 수 있습니다. 클래스 외부 또는 상속받은 클래스에서는 접근할 수
없습니다. 이를 통해 중요한 데이터나 메서드를 외부로부터 보호할 수 있습니다.
3.1 private
예제
<?php
class BankAccount {
private $balance; // 비공개 속성
public function __construct($balance) {
$this->balance = $balance;
}
// 비공개 속성에 접근하는 메서드
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
}
}
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount(100);
// $account->balance = 200; // 오류: private 속성은 외부에서 접근 불가
$account->deposit(50);
echo "현재 잔액: " . $account->getBalance(); // 결과: 현재 잔액: 150
?>
설명:
private
속성은 클래스 외부에서 직접 접근할 수 없습니다. 예를 들어, **$account->balance
*에 직접 접근하면 오류가 발생합니다.- 대신, 클래스 내부의 메서드를 통해
balance
속성을 수정하거나 조회할 수 있습니다.
4. protected
접근 제어자
protected
접근 제어자는 클래스 내부와 상속받은 클래스에서만 접근할 수 있습니다. 클래스
외부에서는 접근할 수 없지만, 상속 구조에서 부모 클래스의 속성과 메서드를 자식 클래스가 사용할 수 있도록 허용합니다.
4.1 protected
예제
<?php
class Animal {
protected $name; // 보호된 속성
public function __construct($name) {
$this->name = $name;
}
protected function makeSound() {
return "$this->name makes a sound.";
}
}
class Dog extends Animal {
public function bark() {
return "$this->name barks."; // 보호된 속성에 접근 가능
}
}
$dog = new Dog("Rex");
// echo $dog->name; // 오류: protected 속성은 외부에서 접근 불가
echo $dog->bark(); // 결과: Rex barks.
?>
설명:
protected
속성은 클래스 내부와 자식 클래스에서만 접근할 수 있습니다. 외부에서 직접 접근하려고 하면 오류가 발생합니다.Dog
클래스는Animal
클래스를 상속받았기 때문에$name
속성에 접근할 수 있습니다.
5. 메서드의 접근 제어
PHP에서는 속성뿐만 아니라 메서드에도 접근 제어자를 적용할 수 있습니다. 이를 통해 메서드의 사용 범위를 제한하고, 특정 메서드를 외부나 자식 클래스에서 사용하지 못하도록 설정할 수 있습니다.
5.1 메서드 접근 제어 예제
<?php
class Car {
private $speed; // 비공개 속성
// 공개 메서드
public function setSpeed($speed) {
if ($speed > 0) {
$this->speed = $speed;
$this->applySpeed();
}
}
// 비공개 메서드
private function applySpeed() {
echo "The car is moving at $this->speed km/h.<br>";
}
}
$car = new Car();
$car->setSpeed(60); // 결과: The car is moving at 60 km/h.
// $car->applySpeed(); // 오류: private 메서드에 외부에서 접근 불가
?>
설명:
public
메서드는 외부에서 호출할 수 있습니다. 예를 들어,setSpeed()
메서드는 외부에서 호출 가능하며, 이 메서드는applySpeed()
라는 비공개 메서드를 호출합니다.private
메서드는 클래스 외부에서 호출할 수 없으며, 클래스 내부에서만 사용할 수 있습니다.
6. 실용 예제: 접근 제어를 통한 안전한 사용자 클래스 구현
<?php
class User {
private $username;
private $password;
public function __construct($username, $password) {
$this->username = $username;
$this->setPassword($password);
}
// 비밀번호를 안전하게 설정하는 메서드
private function setPassword($password) {
if (strlen($password) >= 8) {
$this->password = password_hash($password, PASSWORD_DEFAULT);
} else {
throw new Exception("비밀번호는 8자 이상이어야 합니다.");
}
}
public function login($password) {
if (password_verify($password, $this->password)) {
return "로그인 성공!";
} else {
return "비밀번호가 틀렸습니다.";
}
}
}
$user = new User("john_doe", "mypassword123");
echo $user->login("mypassword123"); // 결과: 로그인 성공!
// echo $user->password; // 오류: private 속성에 외부에서 접근 불가
?>
설명:
private
접근 제어자를 사용하여 비밀번호를 외부에서 직접 수정하거나 조회할 수 없도록 보호합니다.- 비밀번호는
setPassword()
메서드를 통해 안전하게 설정되며, 비밀번호 검증은password_verify()
함수로 처리됩니다.
7. 요약
PHP 접근 제어자는 클래스의 속성과 메서드의 접근 범위를 제한하여 **캡슐화(Encapsulation)**를 구현하는 데 중요한 역할을 합니다.
**public
**은 어디서나 접근 가능하며, **private
**은 클래스 내부에서만, **protected
**는 상속받은 클래스와
클래스 내부에서만 접근할 수 있습니다. 이를 통해 클래스의 데이터를 보호하고, 불필요한 외부 접근을 차단하여 코드의 안전성을 높일 수 있습니다.