코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP Access Modifiers

PHP 접근 제어자(Access Modifiers): 속성과 메서드의 가시성 제어


  • *PHP 접근 제어자(Access Modifiers)**는 클래스 내의 속성메서드에 대한 접근 권한을 제어하는 중요한 개념입니다. 이를 통해 객체 지향 프로그래밍에서 **캡슐화(Encapsulation)**를 구현할 수 있으며, 데이터와 메서드의 접근성을 적절히 관리하여 클래스 내부의 구조를 보호할 수 있습니다.

PHP에서는 public, private, protected 세 가지 접근 제어자를 지원하며, 각각의 접근 제어자는 클래스 속성과 메서드가 어디서 접근할 수 있는지를 결정합니다.


1. PHP 접근 제어자의 종류

  1. public: 모든 곳에서 접근 가능합니다. 클래스 내부, 외부, 그리고 상속받은 클래스에서도 접근할 수 있습니다.
  2. private: 클래스 내부에서만 접근 가능합니다. 외부나 상속받은 클래스에서는 접근할 수 없습니다.
  3. 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 클래스의 modelcolor 속성은 외부에서 직접 접근 및 수정이 가능합니다.

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**는 상속받은 클래스와 클래스 내부에서만 접근할 수 있습니다. 이를 통해 클래스의 데이터를 보호하고, 불필요한 외부 접근을 차단하여 코드의 안전성을 높일 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com