📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 03 캡슐화 (public, private, protected)

2025. 7. 30. 12:07프로그램/PHP 중급

📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 03 캡슐화 (public, private, protected)

📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 03 캡슐화 (public, private, protected)



#PHP #객체_지향_프로그래밍(OOP)에서 #캡슐화는 클래스 내부의 #데이터(속성)와 #메서드를 하나로 묶고, 외부로부터 직접적인 접근을 제한하여 #객체의 #무결성을 보호하는 중요한 개념입니다. 이를 통해 개발자는 코드의 #유지보수성과 #재사용성을 높일 수 있습니다. PHP에서는 접근 제어자 #public, #private, #protected를 사용하여 캡슐화를 구현합니다.

 


 

접근 제어자 (Access Modifiers) 개요

 

PHP의 접근 제어자는 클래스의 속성(변수)과 메서드에 대한 #접근_권한을 정의합니다.

  • public: 클래스 내부, 외부 어디에서든 자유롭게 접근할 수 있습니다. 가장 개방적인 접근 권한입니다.
  • private: 해당 클래스 내부에서만 접근할 수 있습니다. 자식 클래스에서도 접근할 수 없으며, 외부에서는 전혀 접근할 수 없습니다. 가장 엄격한 접근 권한입니다.
  • protected: 해당 클래스 내부와 해당 클래스를 #상속받은 #자식_클래스에서만 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.

 


 

public 접근 제어자

public으로 선언된 속성이나 메서드는 모든 곳에서 접근이 가능합니다. 이는 객체 지향의 캡슐화 원칙에 위배될 수 있으므로, 꼭 필요한 경우에만 public으로 선언하는 것이 좋습니다.

PHP
 
<?php
class Person {
    public $name; // public 속성

    public function introduce() { // public 메서드
        echo "안녕하세요, 제 이름은 {$this->name}입니다.". "<br>";
    }
}

$person = new Person();
$person->name = "홍길동"; // 외부에서 public 속성 접근
$person->introduce(); // 외부에서 public 메서드 호출

echo "외부에서 직접 접근한 이름: " . $person->name . "<br>";
?>

위 예제에서 $name 속성과 introduce() 메서드는 public으로 선언되어 클래스 외부에서 자유롭게 접근하고 수정할 수 있습니다.

 


 

private 접근 제어자

private으로 선언된 속성이나 메서드는 오직 해당 클래스 내부에서만 접근할 수 있습니다. 이는 클래스 외부에서 데이터가 직접 수정되거나, 내부 로직이 임의로 호출되는 것을 방지하여 #데이터_은닉을 실현하는 데 매우 중요합니다. private 속성에 접근하려면 보통 #Getter(읽기) 및 #Setter(쓰기) 메서드를 사용합니다.

PHP
 
<?php
class Account {
    private $balance; // private 속성

    public function __construct($initialBalance) {
        $this->balance = $initialBalance;
    }

    // private 속성에 접근하는 public Getter 메서드
    public function getBalance() {
        return $this->balance;
    }

    // private 속성을 변경하는 public Setter 메서드
    public function deposit($amount) {
        if ($amount > 0) {
            $this->balance += $amount;
            echo "{$amount}원 입금되었습니다. 현재 잔액: {$this->balance}". "<br>";
        } else {
            echo "유효하지 않은 금액입니다.". "<br>";
        }
    }

    // private 메서드 (클래스 내부에서만 호출 가능)
    private function logTransaction($type, $amount) {
        echo "[로그] {$type}: {$amount}원". "<br>";
    }

    public function withdraw($amount) {
        if ($amount > 0 && $this->balance >= $amount) {
            $this->balance -= $amount;
            $this->logTransaction("출금", $amount); // private 메서드 호출
            echo "{$amount}원 출금되었습니다. 현재 잔액: {$this->balance}". "<br>";
        } else {
            echo "잔액이 부족하거나 유효하지 않은 금액입니다.". "<br>";
        }
    }
}

$account = new Account(10000);
echo "현재 잔액: " . $account->getBalance() . "<br>"; // Getter를 통해 접근

$account->deposit(5000);
// $account->balance = 20000; // 오류 발생: private 속성 외부 접근 불가
// $account->logTransaction("test", 100); // 오류 발생: private 메서드 외부 호출 불가

$account->withdraw(3000);
?>

위 예제에서 $balance는 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 대신 getBalance() (Getter)와 deposit(), withdraw() (Setter 역할) 같은 public 메서드를 통해 안전하게 접근하고 조작합니다. 또한 logTransaction() 메서드는 private이므로 withdraw() 메서드 내부에서만 호출 가능하며 외부에서는 호출할 수 없습니다.

 


 

protected 접근 제어자

protected로 선언된 속성이나 메서드는 해당 클래스와 그 클래스를 상속받은 자식 클래스에서만 접근할 수 있습니다. 이는 상속 관계에서 부모 클래스의 일부 내부 구현을 자식 클래스에서 활용할 수 있도록 허용하면서도, 외부로부터는 보호하고 싶을 때 유용합니다.

PHP
 
<?php
class Vehicle {
    protected $brand; // protected 속성
    private $model; // private 속성 (자식도 접근 불가)

    public function __construct($brand, $model) {
        $this->brand = $brand;
        $this->model = $model;
    }

    protected function getModel() { // protected 메서드
        return $this->model;
    }

    public function getInfo() {
        return "브랜드: {$this->brand}, 모델: {$this->getModel()}". "<br>";
    }
}

class Car extends Vehicle {
    public function __construct($brand, $model) {
        parent::__construct($brand, $model);
    }

    public function getCarDetails() {
        // 부모 클래스의 protected 속성과 메서드에 접근 가능
        return "이 자동차의 브랜드는 {$this->brand}이고, 모델은 {$this->getModel()}입니다.". "<br>";
    }
}

$car = new Car("Hyundai", "Sonata");
echo $car->getInfo(); // public 메서드를 통해 정보 접근
echo $car->getCarDetails(); // 자식 클래스에서 protected 멤버 접근

// echo $car->brand; // 오류 발생: protected 속성 외부 접근 불가
// echo $car->getModel(); // 오류 발생: protected 메서드 외부 호출 불가
?>

이 예제에서 Vehicle 클래스의 $brand 속성과 getModel() 메서드는 protected로 선언되어 있습니다. Car 클래스는 Vehicle을 상속받았기 때문에, getCarDetails() 메서드 내에서 $this->brand와 $this->getModel()을 통해 접근할 수 있습니다. 그러나 클래스 외부에서는 이들에 직접 접근할 수 없습니다. $model은 private이므로 Car 클래스에서도 직접 접근할 수 없고, getModel() 메서드를 통해서만 간접적으로 접근할 수 있습니다.

 


 

#캡슐화는 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 클래스의 #내부_구현을 숨기고 #외부_인터페이스만을 노출하여 코드의 복잡성을 줄이고 #견고성을 높이는 데 기여합니다. 적절한 접근 제어자 사용은 잘 설계된 객체 지향 시스템의 기반이 됩니다.

 

블로그KT고정, 쇼핑/지도 마케팅KT유동, 게임/앱플레이어 고정IP, 24시간상담 대량구매 시 할인혜택 제공!

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com