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
25setter는 값을 저장하기 전에 이메일 형식을 검증하고 나이가 적절한지 확인합니다. setter가 없으면 누구든지 유효하지 않은 데이터를 직접 할당할 수 있습니다. 또한 getter만 제공하여 읽기 전용 속성을 만들거나, setter만 제공하여 쓰기 전용 속성을 만들 수도 있습니다.
핵심 포인트: 게터(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 속성에 대한 변경을 허용하기 전에 들어오는 데이터를 검증합니다. 유효하지 않은 데이터(예: 음수 재고)가 전달되면 세터는 이를 단순히 무시하고 기존의 유효한 값을 유지합니다. 이것이 바로 캡슐화의 힘입니다. 외부 코드의 동작과 상관없이 객체는 스스로의 무결성을 유지합니다.
치트 시트
게터(getters)와 세터(setters)를 사용하여 프라이빗(private) 프로퍼티에 대한 제어된 접근을 제공하세요. 게터는 값을 가져오고, 세터는 선택적 유효성 검사와 함께 값을 수정합니다:
<?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(); // john@example.com
echo $user->getAge(); // 25
세터는 데이터를 저장하기 전에 유효성을 검사할 수 있습니다. 유효성 검사에 실패하면 세터는 업데이트를 무시하고 기존 값을 그대로 유지할 수 있습니다. 게터만 제공하여 읽기 전용 프로퍼티를 만들거나, 세터만 제공하여 쓰기 전용 프로퍼티를 만들 수 있습니다.
직접 해보기
<?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를 사용하여 초기 이름, 가격(float), 재고(integer) 할당
// TODO: getInfo() 결과 출력
// TODO: newPrice(float)로 가격을 업데이트하고 getInfo()를 다시 출력
// TODO: 재고를 -5(유효하지 않음)로 설정을 시도하고 getInfo()를 출력하여 재고가 변경되지 않았는지 확인
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션