Menu
Coddy logo textTech

인터페이스 구현하기

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

이제 인터페이스가 무엇인지 이해했으므로, 실제로 어떻게 구현하는지 살펴보겠습니다. 클래스는 implements 키워드를 사용하여 인터페이스를 구현하며, 해당 인터페이스에 선언된 모든 메서드에 대해 구체적인 구현을 제공해야 합니다.

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

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

$doc = new Document("Hello World");
echo $doc->print();

출력:

Printing: Hello World

Document 클래스는 자체적인 print() 메서드 버전을 제공함으로써 Printable을 구현합니다. 필수 메서드를 구현하는 것을 잊어버리면 PHP는 치명적 오류(fatal error)를 발생시킵니다.

서로 다른 클래스들이 동일한 인터페이스를 각자의 방식으로 구현할 수 있습니다:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

$invoice = new Invoice(150);
echo $invoice->print();

출력:

Invoice Total: $150

DocumentInvoice 모두 Printable 계약을 충족하지만, 각각의 목적에 따라 인쇄를 다르게 처리합니다.

핵심 포인트: 클래스를 인터페이스에 연결하려면 implements를 사용하고, 필요한 모든 메서드를 정의합니다. 각 구현 클래스는 고유한 로직을 제공하는 한편, 동일한 메서드 시그니처가 존재함을 보장합니다.

challenge icon

챌린지

쉬움

서로 다른 클래스가 동일한 인터페이스를 각자의 고유한 방식으로 어떻게 구현할 수 있는지 보여주는 메시징 시스템을 구축해 보겠습니다.

서로 다른 유형의 메시지를 처리하기 위해 함께 작동하는 세 개의 파일을 생성하게 됩니다:

  • Messageable.phpcompose($content)deliver()라는 두 개의 메서드 시그니처를 가진 Messageable 인터페이스를 정의합니다. 이 인터페이스는 모든 메시지 유형이 따라야 하는 계약을 설정합니다.
  • Email.phpMessageable을 구현하는 Email 클래스를 생성합니다. 파일 상단에 인터페이스 파일을 포함하세요. 이 클래스는 private $recipient 속성과 private $body 속성을 가져야 합니다. 생성자는 수신자 주소를 인자로 받습니다. compose($content)를 구현하여 $body에 내용을 저장하고 "Email composed"를 반환하도록 합니다. deliver()를 구현하여 "Email to [recipient]: [body]"를 반환하도록 합니다.
  • SMS.php — 마찬가지로 Messageable을 구현하는 SMS 클래스를 생성합니다. 파일 상단에 인터페이스 파일을 포함하세요. 이 클래스는 private $phoneNumber 속성과 private $text 속성을 가져야 합니다. 생성자는 전화번호를 인자로 받습니다. compose($content)를 구현하여 $text에 내용을 저장하고 "SMS composed"를 반환하도록 합니다. deliver()를 구현하여 "SMS to [phoneNumber]: [text]"를 반환하도록 합니다.

main.php에서 Email과 SMS 파일을 모두 포함합니다. 이메일 주소, 전화번호, 메시지 내용이라는 세 가지 입력을 받게 됩니다. 이메일 주소로 Email 객체를 생성하고 전화번호로 SMS 객체를 생성합니다. 두 객체 모두에서 메시지 내용을 인자로 하여 compose()를 호출하고, 각 결과를 별도의 줄에 출력합니다. 그런 다음 두 객체 모두에서 deliver()를 호출하고, 각 결과를 별도의 줄에 출력합니다. 출력 순서는 email compose, SMS compose, email deliver, SMS deliver 순이어야 합니다.

두 클래스 모두 동일한 Messageable 계약을 충족하지만, 이메일은 수신자 주소를 보여주고 SMS 메시지는 전화번호를 보여주는 등 각자의 목적에 맞게 메시지 작성 및 전달을 처리합니다.

치트 시트

클래스는 implements 키워드를 사용하여 인터페이스를 구현하며, 해당 인터페이스에 선언된 모든 메서드에 대해 구체적인 구현을 제공해야 합니다:

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

class Document implements Printable {
    private $content;
    
    public function __construct($content) {
        $this->content = $content;
    }
    
    public function print() {
        return "Printing: " . $this->content;
    }
}

여러 클래스가 동일한 인터페이스를 구현할 수 있으며, 각 클래스는 자신만의 구현을 제공합니다:

<?php
class Invoice implements Printable {
    private $amount;
    
    public function __construct($amount) {
        $this->amount = $amount;
    }
    
    public function print() {
        return "Invoice Total: $" . $this->amount;
    }
}

클래스가 인터페이스에서 요구하는 모든 메서드를 구현하지 않으면, PHP는 치명적 오류(fatal error)를 발생시킵니다.

직접 해보기

<?php
require_once 'Email.php';
require_once 'SMS.php';

// 입력 읽기
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));

// TODO: 이메일 주소로 Email 객체 생성

// TODO: 전화번호로 SMS 객체 생성

// TODO: 두 객체 모두에서 compose()를 호출하고 결과 출력
// 순서: 이메일 compose, 그 다음 SMS compose

// TODO: 두 객체 모두에서 deliver()를 호출하고 결과 출력
// 순서: 이메일 deliver, 그 다음 SMS deliver
?>
quiz icon실력 점검

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

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