로그인 회원가입
모두인포
전체IT경제사회생활스포츠시사여행연애

PHP Interface

lmkfox · 2025-09-14 · 조회 0
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 프로퍼티 지원 등)이 추가되어, 점점 더 강력한 역할을 하고 있다.

댓글

아직 댓글이 없습니다.

로그인 후 댓글을 남길 수 있습니다.