interface는 클래스가 어떤 메서드를 가져야 하는지 강제합니다.
인터페이스는 다중 구현이 가능합니다. (클래스는 여러 인터페이스를 implements할 수 있음)
클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.
인터페이스 안에서 선언되는 메서드는 항상 public이어야 하며, 구현 클래스에서도 반드시 public으로 구현해야 합니다.
인터페이스도 다른 인터페이스를 extends하여 확장할 수 있습니다. (다중 상속 가능)
interface Logger {
public function log(string $message): void;
}
class FileLogger implements Logger {
public function log(string $message): void {
file_put_contents("app.log", $message.PHP_EOL, FILE_APPEND);
}
}
class ConsoleLogger implements Logger {
public function log(string $message): void {
echo $message . PHP_EOL;
}
}
function process(Logger $logger) {
$logger->log("작업 실행됨");
}
process(new FileLogger());
process(new ConsoleLogger());
위 예제에서 Logger 인터페이스는 log() 메서드를 강제하며, 어떤 로거 구현체를 넘겨주든 동일한 방식으로 사용할 수 있습니다. (다형성)
interface A {
public function foo();
}
interface B extends A {
public function bar();
}
class C implements B {
public function foo() {}
public function bar() {}
}
인터페이스끼리 extends 할 수 있으며, 다중 상속도 가능합니다.
클래스가 B를 구현하면 A의 메서드도 모두 구현해야 합니다.
interface Readable { public function read(); }
interface Writable { public function write(); }
class FileStream implements Readable, Writable {
public function read() {}
public function write() {}
}
PHP는 클래스 다중 상속을 지원하지 않지만, 인터페이스는 여러 개 구현할 수 있습니다.
interface Status {
public const OK = 200;
public const NOT_FOUND = 404;
}
class Response implements Status {
public function getStatusMessage(int $code): string {
return match($code) {
self::OK => "Success",
self::NOT_FOUND => "Not Found",
default => "Unknown"
};
}
}
인터페이스에 상수를 정의할 수 있고, 구현 클래스에서 그대로 사용할 수 있습니다.
단, 오버라이드(값 재정의)는 불가합니다.
PHP 8.1부터 인터페이스에 readonly 프로퍼티를 정의할 수 있습니다.
interface HasId {
public function getId(): int;
}
그러나 일반 프로퍼티 선언은 허용되지 않고, 구현 클래스에서 구현해야 합니다. (실제 데이터 저장은 클래스가 담당)
인터페이스는 타입 선언에 자주 사용됩니다.
function connect(Logger $logger) {
$logger->log("연결 시도");
}
Logger 타입을 받는 함수는 Logger를 구현한 어떤 객체든 받을 수 있습니다.
구분 |
Interface |
Abstract class |
---|---|---|
목적 |
“계약” 정의 |
기본 구현 + 확장 포인트 제공 |
메서드 구현 |
불가능 (PHP 8.0 이전은 전부 추상) |
추상 메서드 + 일반 메서드 혼합 가능 |
프로퍼티 |
직접 저장 불가 (PHP 8.1에서 readonly 제한적 지원) |
인스턴스 변수 가질 수 있음 |
상속/구현 |
다중 구현 가능 |
클래스는 단일 상속만 가능 |
상수 |
정의 가능 |
정의 가능 |
로깅, 캐싱, DB 연결, 메시지 큐 등 교체 가능성이 있는 모듈의 공통 API를 정의할 때
DI(의존성 주입) 패턴에서 인터페이스 기반으로 설계하여 구현체를 유연하게 교체할 때
테스트 작성 시 Mock 객체를 쉽게 만들 수 있도록 계약을 정의할 때
외부에 노출되는 서비스 API는 인터페이스로 정의 → 구현체 교체가 쉬움.
너무 세세한 인터페이스는 피하라 → 지나친 분리보다는 실제 사용에 맞는 수준으로 정의.
구현 클래스 이름보다 인터페이스 이름을 기반으로 코딩 → 느슨한 결합(loose coupling) 유지.
interface는 PHP에서 클래스가 반드시 따라야 할 규약을 정의하는 수단이다.
다형성을 구현하고, 의존성을 줄이며, 확장 가능한 코드를 작성할 수 있게 한다.
PHP 8.1 이후로는 더 많은 기능(상수, readonly 프로퍼티 지원 등)이 추가되어, 점점 더 강력한 역할을 하고 있다.