Getter와 Setter
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 40번째.
이제 접근 제어자를 이해했으니, 클래스 외부에서 private properties와 안전하게 상호 작용하려면 어떻게 해야 할까요? 답은 getter와 setter입니다. private 데이터에 대한 제어된 접근을 제공하는 public method입니다.
getter는 속성의 값을 가져오고, setter는 그 값을 수정합니다. 이 패턴을 사용하면 데이터에 액세스하거나 데이터가 변경될 때 유효성 검사 또는 로직을 추가할 수 있습니다:
<?php
class User {
private string $email;
private int $age;
public function getEmail(): string {
return $this->email;
}
public function setEmail(string $email): void {
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$this->email = $email;
}
}
public function getAge(): int {
return $this->age;
}
public function setAge(int $age): void {
if ($age >= 0 && $age <= 150) {
$this->age = $age;
}
}
}
$user = new User();
$user->setEmail("john@example.com");
$user->setAge(25);
echo $user->getEmail() . "\n";
echo $user->getAge();
출력:
john@example.com
25세터는 email 형식을 검증하고 값을 저장하기 전에 age가 합리적인지 확인합니다. 세터가 없으면 누구나 유효하지 않은 데이터를 직접 할당할 수 있습니다. getter만 제공하여 읽기 전용 속성을 만들거나, 세터만 사용하여 쓰기 전용 속성을 만들 수도 있습니다.
핵심 내용: getter와 setter를 사용하면 private 데이터에 액세스하고 이를 수정하는 방식을 제어할 수 있으므로, 유효성 검사, 형식 지정 또는 사용자 지정 로직을 적용할 수 있습니다.
챌린지
쉬움getter와 setter를 사용하여 제품 데이터를 보호하고 검증하는 제품 재고 시스템을 만들어 보겠습니다. 가격이 항상 양수이고 재고 수량이 음수가 되지 않도록 보장하는 Product class를 만들며, setter가 비즈니스 규칙을 적용하는 방법을 보여 줍니다.
코드를 두 개의 파일로 구성합니다:
Product.php: 세 개의 private properties인$name(문자열),$price(float),$stock(integer)를 갖는Productclass를 Create합니다. 다음 validation 규칙에 따라 각 property에 대한 getter와 setter를 Implement합니다:setName()은 비어 있지 않은 문자열만 accept해야 합니다. 문자열을 trim한 후 empty이면 property를 업데이트하지 않습니다.setPrice()는 0보다 greater한 값만 accept해야 합니다. 0 또는 음수인 가격은 거부합니다.setStock()은 0 이상인 값만 accept해야 합니다. 음수인 재고 수량은 거부합니다.
"[name]: $[price] ([stock] in stock)"을 반환하는 public methodgetInfo()를 추가합니다.main.php: Product 파일을 포함합니다. 네 개의 inputs, 즉 제품 이름, 가격, 재고 수량, 그리고 업데이트할 new price를 받습니다.Productinstance를 Create하고 setter를 사용하여 initial 이름, 가격(float으로 변환), 재고(integer로 변환)를 assign합니다.getInfo()의 결과를 Print합니다. 그런 다음 new price 값(float으로 변환)으로 가격을 업데이트하고getInfo()를 다시 Print합니다. 마지막으로 stock을-5(invalid 값)로 설정해 보고getInfo()를 한 번 더 Print하여 stock이 changed되지 않았음을 confirm합니다.
setter는 gatekeeper 역할을 합니다. private properties의 변경을 허용하기 전에 들어오는 데이터를 검증합니다. 음수 stock과 같은 invalid 데이터가 전달되면 setter는 이를 무시하여 기존의 유효한 값을 그대로 유지합니다. 이것이 캡슐화의 힘입니다. 외부 코드가 무엇을 하려고 하더라도 객체는 자신의 무결성을 유지합니다.
직접 해보기
<?php
require_once 'Product.php';
// 입력 읽기
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: 새로운 Product 인스턴스 생성
// TODO: 세터를 사용하여 초기 name, price (float로), stock (integer로) 할당
// TODO: getInfo()의 결과 출력
// TODO: newPrice (float로)로 price 업데이트하고 getInfo() 다시 출력
// TODO: stock을 -5 (유효하지 않음)로 설정 시도하고 getInfo()를 출력하여 stock이 변경되지 않았음을 확인
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러