인터페이스 구현하기
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 WorldDocument 클래스는 자체적인 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: $150Document와 Invoice 모두 Printable 계약을 충족하지만, 각각의 목적에 따라 인쇄를 다르게 처리합니다.
핵심 포인트: 클래스를 인터페이스에 연결하려면 implements를 사용하고, 필요한 모든 메서드를 정의합니다. 각 구현 클래스는 고유한 로직을 제공하는 한편, 동일한 메서드 시그니처가 존재함을 보장합니다.
챌린지
쉬움서로 다른 클래스가 동일한 인터페이스를 각자의 고유한 방식으로 어떻게 구현할 수 있는지 보여주는 메시징 시스템을 구축해 보겠습니다.
서로 다른 유형의 메시지를 처리하기 위해 함께 작동하는 세 개의 파일을 생성하게 됩니다:
Messageable.php—compose($content)와deliver()라는 두 개의 메서드 시그니처를 가진Messageable인터페이스를 정의합니다. 이 인터페이스는 모든 메시지 유형이 따라야 하는 계약을 설정합니다.Email.php—Messageable을 구현하는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
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션