2025. 7. 30. 12:07ㆍ프로그램/PHP 중급
📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 03 캡슐화 (public, private, protected)

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

접근 제어자 (Access Modifiers) 개요
PHP의 접근 제어자는 클래스의 속성(변수)과 메서드에 대한 #접근_권한을 정의합니다.
- public: 클래스 내부, 외부 어디에서든 자유롭게 접근할 수 있습니다. 가장 개방적인 접근 권한입니다.
- private: 해당 클래스 내부에서만 접근할 수 있습니다. 자식 클래스에서도 접근할 수 없으며, 외부에서는 전혀 접근할 수 없습니다. 가장 엄격한 접근 권한입니다.
- protected: 해당 클래스 내부와 해당 클래스를 #상속받은 #자식_클래스에서만 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.
public 접근 제어자

public으로 선언된 속성이나 메서드는 모든 곳에서 접근이 가능합니다. 이는 객체 지향의 캡슐화 원칙에 위배될 수 있으므로, 꼭 필요한 경우에만 public으로 선언하는 것이 좋습니다.
<?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
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
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
'프로그램 > PHP 중급' 카테고리의 다른 글
| 📚 PHP 중급 - 6주차: OOP 심화 및 디자인 패턴 소개 - 01 추상 클래스, 인터페이스 (0) | 2025.08.04 |
|---|---|
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 04 상속 (extends) (0) | 2025.08.01 |
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 02 생성자 (__construct) (0) | 2025.07.29 |
| 📚 PHP 중급 - 5주차: PHP 객체 지향 프로그래밍 (OOP) 기초 - 01 클래스, 객체, 속성, 메서드 (0) | 2025.07.28 |
| 📚 PHP 중급 - 4주차: 파일 업로드 및 이미지 처리 - 04 이미지 리사이징 및 썸네일 생성 (GD 라이브러리) (0) | 2025.07.27 |