Menu
Coddy logo textTech

다중 인터페이스 구현

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

클래스가 하나의 부모만 확장할 수 있는 상속과 달리, PHP에서는 클래스가 여러 인터페이스를 구현할 수 있습니다. 이를 통해 서로 다른 계약을 결합할 수 있는 유연성을 얻을 수 있으며, 클래스를 더욱 다재다능하게 만들 수 있습니다.

여러 인터페이스를 구현하려면, implements 키워드 뒤에 쉼표로 구분하여 나열하십시오:

<?php
interface Printable {
    public function print();
}

interface Savable {
    public function save();
}

class Report implements Printable, Savable {
    private $title;
    
    public function __construct($title) {
        $this->title = $title;
    }
    
    public function print() {
        return "Printing: " . $this->title;
    }
    
    public function save() {
        return "Saving: " . $this->title;
    }
}

$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();

출력:

Printing: Sales Report
Saving: Sales Report

Report 클래스는 PrintableSavable의 모든 메서드를 구현함으로써 두 계약을 모두 충족합니다. 각 인터페이스에 선언된 모든 메서드에 대한 구현을 제공해야 합니다.

이 접근 방식은 단일 상속의 제약 없이 여러 요구 사항을 충족하는 클래스를 구축할 수 있게 해주기 때문에 강력합니다. 클래스는 출력 가능(printable), 저장 가능(savable), 내보내기 가능(exportable) 등을 동시에 수행할 수 있습니다.

핵심 포인트: 여러 인터페이스를 구현하려면 쉼표를 사용하세요. 클래스는 구현하는 모든 인터페이스의 모든 메서드에 대해 구체적인 구현을 제공해야 합니다.

challenge icon

챌린지

쉬움

단일 클래스가 여러 인터페이스를 구현하여 다양한 기능을 얻는 방법을 보여주는 미디어 파일 시스템을 구축해 보겠습니다.

재생과 공유가 모두 가능한 미디어 파일을 처리하기 위해 함께 작동하는 네 개의 파일을 생성하게 됩니다:

  • Playable.php — 단일 메서드 시그니처인 play()를 가진 Playable 인터페이스를 정의합니다. 이 계약은 재생 가능한 모든 미디어가 시작될 수 있음을 보장합니다.
  • Shareable.php — 단일 메서드 시그니처인 share($platform)를 가진 Shareable 인터페이스를 정의합니다. 이 계약은 공유 가능한 모든 콘텐츠가 다양한 플랫폼으로 배포될 수 있음을 보장합니다.
  • Video.phpPlayableShareable을 모두 구현하는 Video 클래스를 생성합니다. 상단에 두 인터페이스 파일을 포함하세요. 클래스에는 private $title 속성과 private $duration 속성(분 단위)이 있어야 합니다. 생성자는 제목과 기간을 인자로 받습니다. play()를 구현하여 "Playing video: [title] ([duration] min)"을 반환하도록 합니다. share($platform)를 구현하여 "Sharing [title] on [platform]"을 반환하도록 합니다.
  • main.php — Video 파일을 포함합니다. 비디오 제목, 기간(정수로 변환할 문자열), 플랫폼 이름의 세 가지 입력을 받게 됩니다. 제목과 기간으로 Video 객체를 생성합니다. 첫 번째 줄에 play()를 호출한 결과를 출력하고, 두 번째 줄에 플랫폼과 함께 share()를 호출한 결과를 출력합니다.

작성한 Video 클래스는 두 개의 별도 계약을 동시에 충족합니다. 즉, 모든 미디어처럼 재생될 수 있으며 소셜 플랫폼에 공유될 수도 있습니다. 이것이 다중 인터페이스 구현의 힘입니다. 단일 클래스가 단일 상속 체인에 제한되지 않고 서로 다른 소스로부터 기능을 얻을 수 있습니다.

치트 시트

클래스는 implements 키워드 뒤에 쉼표로 구분하여 여러 인터페이스를 구현할 수 있습니다:

<?php
interface Printable {
    public function print();
}

interface Savable {
    public function save();
}

class Report implements Printable, Savable {
    public function print() {
        return "Printing report";
    }
    
    public function save() {
        return "Saving report";
    }
}

클래스는 구현하는 모든 인터페이스의 모든 메서드에 대해 구체적인 구현을 제공해야 합니다. 이를 통해 클래스는 단일 상속의 제약 없이 여러 계약을 동시에 충족할 수 있습니다.

직접 해보기

<?php
// Video 파일을 포함합니다
require_once 'Video.php';

// 입력을 읽습니다
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));

// TODO: 제목과 재생 시간을 사용하여 Video 객체를 생성합니다

// TODO: 첫 번째 줄에 play()를 호출한 결과를 출력합니다

// TODO: 두 번째 줄에 플랫폼과 함께 share()를 호출한 결과를 출력합니다

?>
quiz icon실력 점검

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

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