메서드 오버라이딩
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 23번째.
때때로 부모 클래스로부터 상속받은 메서드가 자식 클래스에 필요한 것과 완전히 일치하지 않을 수 있습니다. 메서드 오버라이딩(Method overriding)을 통해 자식 클래스는 부모 클래스에 이미 존재하는 메서드에 대해 자신만의 구현을 제공할 수 있습니다.
메서드를 오버라이드하려면 부모 메서드와 동일한 이름의 메서드를 자식 클래스에서 정의하기만 하면 됩니다:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "$this->name says meow";
}
}
$cat = new Cat("Whiskers");
echo $cat->speak();
출력:
Whiskers says meowCat 클래스는 부모의 speak() 메서드를 자신의 버전으로 완전히 대체합니다. cat 객체에서 speak()를 호출하면, PHP는 자식의 구현을 사용합니다.
parent::를 자신의 로직과 결합하여 부모의 동작을 확장할 수도 있습니다:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
출력:
Rex makes a sound - woof woof!핵심 포인트: 메서드 오버라이딩을 통해 자식 클래스는 상속받은 동작을 사용자 정의할 수 있습니다. 메서드를 완전히 대체하거나 parent::를 사용하여 기존 구현을 기반으로 확장할 수 있습니다.
챌린지
쉬움자식 클래스가 메서드 오버라이딩을 통해 부모 메서드를 완전히 대체하거나 확장하는 방법을 보여주는 알림 시스템을 구축해 보겠습니다.
각기 고유한 동작을 가진 서로 다른 유형의 알림을 보내기 위해 함께 작동하는 세 개의 파일을 생성합니다:
Notification.php— 모든 알림 유형의 기본이 되는Notification클래스를 정의합니다. 이 클래스는 public$recipient속성과 수신자(recipient)를 받아 설정하는 생성자를 가져야 합니다."Sending to [recipient]: [message]"를 반환하는send($message)메서드를 포함하세요.UrgentNotification.php—Notification을 상속받는UrgentNotification클래스를 정의합니다. 파일 상단에 Notification 파일을 포함(include)하세요. 이 클래스는send($message)메서드를 완전히 오버라이드하여"URGENT to [recipient]: [message]!!!"를 반환해야 합니다. "URGENT" 접두사와 끝에 붙는 느낌표에 주의하세요. 이는 부모의 동작을 완전히 대체하는 것을 보여줍니다.LoggedNotification.php—Notification을 상속받는LoggedNotification클래스를 정의합니다. 파일 상단에 Notification 파일을 포함하세요. 이 클래스는send($message)를 오버라이드하되 부모의 구현을 기반으로 작성해야 합니다.parent::send($message)를 호출하고 결과에" [logged]"를 추가하세요. 이는 동작을 대체하는 대신 확장하는 것을 보여줍니다.
main.php에서 세 개의 알림 클래스 파일을 모두 포함하세요. 수신자 이름과 보낼 메시지라는 두 개의 입력을 받게 됩니다. 각 알림 유형의 인스턴스를 하나씩 생성하고(모두 동일한 수신자 사용), 각각에 대해 메시지와 함께 send()를 호출하세요. 각 결과를 일반 알림, 긴급 알림, 로그 기록 알림 순서대로 각각 한 줄씩 출력하세요.
이 챌린지는 메서드 오버라이딩의 두 가지 접근 방식을 모두 보여줍니다. UrgentNotification은 부모의 로직을 자체 형식으로 완전히 대체하는 반면, LoggedNotification은 parent::를 사용하여 원래 동작을 유지하면서 내용을 추가합니다.
치트 시트
메서드 오버라이딩을 사용하면 자식 클래스가 부모 클래스로부터 상속받은 메서드에 대해 자체적인 구현을 제공할 수 있습니다.
메서드를 오버라이드하려면 부모 메서드와 동일한 이름을 가진 메서드를 자식 클래스에 정의하세요:
<?php
class Animal {
public function speak() {
return "makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "says meow";
}
}
자식 클래스는 부모의 메서드 구현을 완전히 대체합니다. 자식 객체에서 호출될 때, PHP는 자식 클래스의 버전을 사용합니다.
부모의 동작을 대체하는 대신 확장하려면, parent::를 사용하여 부모 메서드를 호출하고 자신만의 로직을 추가하세요:
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
이것은 부모의 원래 동작과 자식 클래스의 추가 기능을 결합합니다.
직접 해보기
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// 입력 읽기
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: 각 알림 유형의 인스턴스를 하나씩 생성 (모두 동일한 수신자 사용)
// TODO: 각 알림에 대해 메시지와 함께 send() 호출
// 다음 순서대로 각 결과를 별도의 줄에 출력:
// 1. 일반 알림 (Regular notification)
// 2. 긴급 알림 (Urgent notification)
// 3. 로그 기록 알림 (Logged notification)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션