Getter와 Setter
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 40번째.
이제 접근 제어자를 이해하셨으니, 클래스 외부에서 private 속성과 어떻게 안전하게 상호작용할 수 있을까요? 그 답은 바로 게터(getters)와 세터(setters)입니다. 이는 private 데이터에 대한 제어된 접근을 제공하는 public 메서드입니다.
게터(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세터(setter)는 값을 저장하기 전에 이메일 형식을 검증하고 나이가 적절한지 확인합니다. 세터가 없으면 누구나 유효하지 않은 데이터를 직접 할당할 수 있습니다. 또한 게터(getter)만 제공하여 읽기 전용 속성을 만들거나, 세터만 제공하여 쓰기 전용 속성을 만들 수도 있습니다.
핵심 포인트: Getter와 setter는 프라이빗 데이터가 액세스되고 수정되는 방식을 제어할 수 있게 하여, 유효성 검사, 포맷팅 또는 기타 커스텀 로직을 적용할 수 있도록 합니다.
챌린지
쉬움게터(getters)와 세터(setters)를 사용하여 제품 데이터를 보호하고 검증하는 제품 인보토리 시스템을 구축해 보겠습니다. 가격은 항상 양수이고 재고 수량은 절대 음수가 되지 않도록 보장하는 Product 클래스를 만들게 됩니다. 이는 세터가 어떻게 비즈니스 규칙을 강제할 수 있는지 보여줍니다.
코드는 두 개의 파일로 구성됩니다:
Product.php— 세 개의 private 속성인$name(string),$price(float),$stock(integer)을 가진Product클래스를 생성하세요. 다음 검증 규칙을 포함하여 각 속성에 대한 게터와 세터를 구현하세요:setName()은 비어 있지 않은 문자열만 허용해야 합니다. 트리밍(trimming) 후 문자열이 비어 있으면 속성을 업데이트하지 마세요.setPrice()는 0보다 큰 값만 허용해야 합니다. 0 또는 음수 가격은 거부하세요.setStock()은 0 이상의 값만 허용해야 합니다. 음수 재고 수량은 거부하세요.
"[name]: $[price] ([stock] in stock)"형식을 반환하는 public 메서드getInfo()를 추가하세요.main.php— Product 파일을 포함하세요. 제품 이름, 가격, 재고 수량, 그리고 업데이트할 새 가격까지 총 네 개의 입력을 받게 됩니다.Product인스턴스를 생성하고 세터를 사용하여 초기 이름, 가격(float로 변환), 재고(integer로 변환)를 할당하세요.getInfo()의 결과를 출력하세요. 그런 다음 새 가격 값(float로 변환)으로 가격 업데이트를 시도하고getInfo()를 다시 출력하세요. 마지막으로 재고를-5(유효하지 않은 값)로 설정하려고 시도한 후, 재고가 변경되지 않았음을 확인하기 위해getInfo()를 한 번 더 출력하세요.
세터는 게이트키퍼 역할을 합니다. private 속성에 대한 변경을 허용하기 전에 들어오는 데이터를 검증합니다. 유효하지 않은 데이터(예: 음수 재고)가 전달되면 세터는 이를 단순히 무시하여 기존의 유효한 값을 그대로 유지합니다. 이것이 바로 캡슐화의 힘입니다. 외부 코드의 동작과 상관없이 객체가 스스로의 무결성을 유지할 수 있게 합니다.
직접 해보기
<?php
require_once 'Product.php';
// 입력값 읽기
$name = trim(fgets(STDIN));
$price = trim(fgets(STDIN));
$stock = trim(fgets(STDIN));
$newPrice = trim(fgets(STDIN));
// TODO: 새로운 Product 인스턴스 생성
// TODO: setter를 사용하여 초기 name, price(float 타입), stock(integer 타입) 할당
// TODO: getInfo()의 결과 출력
// TODO: price를 newPrice(float 타입)로 업데이트하고 getInfo()를 다시 출력
// TODO: stock을 -5(유효하지 않음)로 설정을 시도하고, getInfo()를 출력하여 stock이 변경되지 않았음을 확인
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션