IT
PHP Interface
1. 기본 개념
-
interface는 클래스가 어떤 메서드를 가져야 하는지 강제합니다.
-
인터페이스는 다중 구현이 가능합니다. (클래스는 여러 인터페이스를 implements할 수 있음)
-
클래스는 implements 키워드를 사용하여 인터페이스를 구현합니다.
-
인터페이스 안에서 선언되는 메서드는 항상 public이어야 하며, 구현 클래스에서도 반드시 public으로 구현해야 합니다.
-
인터페이스도 다른 인터페이스를 extends하여 확장할 수 있습니다. (다중 상속 가능)
2. 기본 문법
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() 메서드를 강제하며, 어떤 로거 구현체를 넘겨주든 동일한 방식으로 사용할 수 있습니다. (다형성)
3. 주요 특징
(1) 인터페이스 상속
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의 메서드도 모두 구현해야 합니다.
(2) 다중 구현
interface Readable { public function read(); }
interface Writable { public function write(); }
class FileStream implements Readable, Writable {
public function read() {}
public function write() {}
}
-
PHP는 클래스 다중 상속을 지원하지 않지만, 인터페이스는 여러 개 구현할 수 있습니다.
(3) 상수 정의 (PHP 5.3+)
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"
};
}
}
-
인터페이스에 상수를 정의할 수 있고, 구현 클래스에서 그대로 사용할 수 있습니다.
-
단, 오버라이드(값 재정의)는 불가합니다.
(4) 인터페이스의 프로퍼티 (PHP 8.1+)
-
PHP 8.1부터 인터페이스에 readonly 프로퍼티를 정의할 수 있습니다.
interface HasId {
public function getId(): int;
}
-
그러나 일반 프로퍼티 선언은 허용되지 않고, 구현 클래스에서 구현해야 합니다. (실제 데이터 저장은 클래스가 담당)
(5) 타입 힌팅과 인터페이스
인터페이스는 타입 선언에 자주 사용됩니다.
function connect(Logger $logger) {
$logger->log("연결 시도");
}
-
Logger 타입을 받는 함수는 Logger를 구현한 어떤 객체든 받을 수 있습니다.
4.
abstract class
와의 차이
구분
Interface
Abstract class
목적
“계약” 정의
기본 구현 + 확장 포인트 제공
메서드 구현
불가능 (PHP 8.0 이전은 전부 추상)
추상 메서드 + 일반 메서드 혼합 가능
프로퍼티
직접 저장 불가 (PHP 8.1에서 readonly 제한적 지원)
인스턴스 변수 가질 수 있음
상속/구현
다중 구현 가능
클래스는 단일 상속만 가능
상수
정의 가능
정의 가능
5. 실무에서의 사용 예
-
로깅, 캐싱, DB 연결, 메시지 큐 등 교체 가능성이 있는 모듈의 공통 API를 정의할 때
-
DI(의존성 주입) 패턴에서 인터페이스 기반으로 설계하여 구현체를 유연하게 교체할 때
-
테스트 작성 시 Mock 객체를 쉽게 만들 수 있도록 계약을 정의할 때
6. 베스트 프랙티스
-
외부에 노출되는 서비스 API는 인터페이스로 정의 → 구현체 교체가 쉬움.
-
너무 세세한 인터페이스는 피하라 → 지나친 분리보다는 실제 사용에 맞는 수준으로 정의.
-
구현 클래스 이름보다 인터페이스 이름을 기반으로 코딩 → 느슨한 결합(loose coupling) 유지.
결론
-
interface는 PHP에서 클래스가 반드시 따라야 할 규약을 정의하는 수단이다.
-
다형성을 구현하고, 의존성을 줄이며, 확장 가능한 코드를 작성할 수 있게 한다.
-
PHP 8.1 이후로는 더 많은 기능(상수, readonly 프로퍼티 지원 등)이 추가되어, 점점 더 강력한 역할을 하고 있다.
댓글
아직 댓글이 없습니다.
로그인 후 댓글을 남길 수 있습니다.