Menu
Coddy logo textTech

메서드 오버라이딩 다시 보기

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 33번째.

상속 챕터에서 이미 method 오버라이딩에 대해 배웠습니다. 이제 이것이 객체 지향 프로그래밍에서 가장 강력한 개념 중 하나인 다형성과 어떻게 연결되는지 살펴보겠습니다.

다형성은 "여러 형태"를 의미합니다. 자식 class에서 method를 재정의하면, 같은 이름을 유지하면서 해당 method에 다른 형태를 부여하는 것입니다. 마법은 객체를 parent 타입을 통해 다룰 때 일어납니다:

<?php
class Animal {
    public function speak() {
        return "Some sound";
    }
}

class Dog extends Animal {
    public function speak() {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function speak() {
        return "Meow!";
    }
}

function makeAnimalSpeak(Animal $animal) {
    return $animal->speak();
}

echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());

출력:

Woof!
Meow!

makeAnimalSpeak() 함수는 모든 Animal을 허용합니다. 이 함수는 Dog를 받는지 Cat을 받는지 알지도 못하고 신경 쓰지도 않습니다. PHP는 런타임에 실제 객체 유형에 따라 올바르게 재정의된 메서드를 자동으로 호출합니다.

이것이 다형성이 작동하는 모습입니다.

이 접근 방식을 사용하면 구체적인 유형을 알지 못해도 서로 관련된 객체군과 함께 작동하는 유연한 코드를 작성할 수 있습니다. 나중에 새로운 animal 클래스를 추가해도 function이 자동으로 해당 클래스들과 함께 작동합니다.

핵심 사항: Method 오버라이딩은 서로 다른 클래스가 동일한 method 호출에 다르게 응답할 수 있도록 하여 다형성을 가능하게 하며, 이는 런타임에 실제 객체 유형에 따라 결정됩니다.

challenge icon

챌린지

쉬움

method overriding을 통해 다형성을 보여 주는 musical instrument 시스템을 만들어 보자. 기본 Instrument class와 각각 고유한 소리를 내는 두 child class를 만들고, 하나의 function을 사용해 모든 instrument를 다형적으로 연주하게 된다.

코드를 네 개의 file로 구성한다:

  • Instrument.php: protected $name property를 constructor를 통해 설정하는 Instrument class를 Create한다. "[name] makes a sound"를 반환하는 play() method를 Add한다. 이는 child class가 Override할 기본 동작이다.
  • Guitar.php: Instrument를 extends하는 Guitar class를 Create한다. parent file을 Include한다. constructor는 이름을 accepts하고 이를 parent constructor에 전달한다. "[name] strums a chord"를 반환하도록 play() method를 Override한다.
  • Drum.php: Instrument를 extends하는 Drum class를 Create한다. parent file을 Include한다. constructor는 이름을 accepts하고 이를 parent constructor에 전달한다. "[name] beats a rhythm"을 반환하도록 play() method를 Override한다.
  • main.php: Guitar 및 Drum file을 모두 Include한다. Instrument parameter를 accepts하는(타입 힌트가 지정된) performWith라는 function을 Create하고, 해당 객체에서 play()를 calling한 결과를 반환한다. 이 function은 다형성을 보여 준다. parent class type hint를 통해 모든 instrument type에서 작동한다.

두 개의 입력을 받는다. 하나는 guitar의 이름이고 다른 하나는 drum의 이름이다. 이 이름으로 GuitarDrum을 Create한다. 각각을 performWith() function에 전달하고 결과를 출력한다. guitar를 first로 출력한 다음 drum을 출력하며, 각각은 별도의 줄에 표시한다.

performWith()가 어떤 Instrument든 accepts하지만, PHP가 runtime에 실제 객체 type을 기반으로 올바른 Override된 play() method를 자동으로 calling하는 방식을 확인하자. 이것이 바로 다형성이 작동하는 방식이다!

직접 해보기

<?php
// 악기 파일들을 포함합니다
require_once 'Guitar.php';
require_once 'Drum.php';

// 입력 읽기
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));

// TODO: performWith라는 함수를 생성하세요:
// - Instrument 매개변수를 받습니다 (타입 힌트 사용: Instrument $instrument)
// - 악기에서 play()를 호출한 결과를 반환합니다

// TODO: $guitarName으로 Guitar를 만들고 $drumName으로 Drum을 만드세요
// TODO: 각각을 performWith()에 전달하고 결과를 출력하세요 (기타 먼저, 그다음 드럼)

?>
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 PHP 컴파일러