Menu
Coddy logo textTech

메서드 오버라이딩

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 meow

Cat 클래스는 부모의 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::를 사용하여 기존 구현을 기반으로 확장할 수 있습니다.

challenge icon

챌린지

쉬움

자식 클래스가 메서드 오버라이딩을 통해 부모 메서드를 완전히 대체하거나 확장하는 방법을 보여주는 알림 시스템을 구축해 보겠습니다.

각기 고유한 동작을 가진 서로 다른 유형의 알림을 보내기 위해 함께 작동하는 세 개의 파일을 생성합니다:

  • Notification.php — 모든 알림 유형의 기본이 되는 Notification 클래스를 정의합니다. 이 클래스는 public $recipient 속성과 수신자(recipient)를 받아 설정하는 생성자를 가져야 합니다. "Sending to [recipient]: [message]"를 반환하는 send($message) 메서드를 포함하세요.
  • UrgentNotification.phpNotification을 상속받는 UrgentNotification 클래스를 정의합니다. 파일 상단에 Notification 파일을 포함(include)하세요. 이 클래스는 send($message) 메서드를 완전히 오버라이드하여 "URGENT to [recipient]: [message]!!!"를 반환해야 합니다. "URGENT" 접두사와 끝에 붙는 느낌표에 주의하세요. 이는 부모의 동작을 완전히 대체하는 것을 보여줍니다.
  • LoggedNotification.phpNotification을 상속받는 LoggedNotification 클래스를 정의합니다. 파일 상단에 Notification 파일을 포함하세요. 이 클래스는 send($message)를 오버라이드하되 부모의 구현을 기반으로 작성해야 합니다. parent::send($message)를 호출하고 결과에 " [logged]"를 추가하세요. 이는 동작을 대체하는 대신 확장하는 것을 보여줍니다.

main.php에서 세 개의 알림 클래스 파일을 모두 포함하세요. 수신자 이름과 보낼 메시지라는 두 개의 입력을 받게 됩니다. 각 알림 유형의 인스턴스를 하나씩 생성하고(모두 동일한 수신자 사용), 각각에 대해 메시지와 함께 send()를 호출하세요. 각 결과를 일반 알림, 긴급 알림, 로그 기록 알림 순서대로 각각 한 줄씩 출력하세요.

이 챌린지는 메서드 오버라이딩의 두 가지 접근 방식을 모두 보여줍니다. UrgentNotification은 부모의 로직을 자체 형식으로 완전히 대체하는 반면, LoggedNotificationparent::를 사용하여 원래 동작을 유지하면서 내용을 추가합니다.

치트 시트

메서드 오버라이딩을 사용하면 자식 클래스가 부모 클래스로부터 상속받은 메서드에 대해 자체적인 구현을 제공할 수 있습니다.

메서드를 오버라이드하려면 부모 메서드와 동일한 이름을 가진 메서드를 자식 클래스에 정의하세요:

<?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)

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨